在 Python 中读取 TXT 或 DAT 文件

问题描述

我需要读取 .DAT 或 .TXT 文件提取列名并将它们分配给新名称并将数据写入 Pandas 数据帧。

我有一个名为“filetype”的环境变量,根据它的值(DAT 或 TXT),我需要相应地读取文件并从中提取列名并分配给新的列名。

我输入的 .dat/.txt 文件只有 2 列,如下所示:

LN_ID,LN_DT

1234,10/01/2020

4567,10/01/2020

8888,10/01/2020

9999,10/01/2020

读取上述文件并创建新列 new_loan_id=loan_id 和 new_ln_dt=ln_dt 并写入熊猫数据帧

我已经尝试使用如下所示的 Pandas,但它给出了一些错误,我还想首先根据环境变量“filetype”值检查 myfile 是 .dat 还是 .txt 并继续。

df=pd.read_csv('myfile.dat',sep=',')

new_cols=['new_ln_id','new_ln_dt']

df.columns=new_cols

我认为可能有一些更好更简单的方法。感谢有人可以提供帮助。谢谢!

解决方法

从您的问题中不清楚您是想要两个新的空列还是想要替换现有名称。无论哪种方式,您都可以为以下给出的 dte 执行此操作:

添加列

  LN_ID       LN_DT
0   1234  10/01/2020
1   4567  10/01/2020
2   8888  10/01/2020
3   9999  10/01/2020

定义新列

cols = ['new_ln_id','new_ln_dt']

和`

print(pd.concat([dte,pd.DataFrame(columns=cols)]))

给出

    LN_ID       LN_DT new_ln_id new_ln_dt
0  1234.0  10/01/2020       NaN       NaN
1  4567.0  10/01/2020       NaN       NaN
2  8888.0  10/01/2020       NaN       NaN
3  9999.0  10/01/2020       NaN       NaN

替换列名

df.rename(columns={"LN_ID": "new_ln_id","LN_DT": "new_ln_dt"})

感谢您的回复,对于造成的混乱,我们深表歉意。我想重命名 2 列。但是,实际上,我想首先检查它是基于名为“filetype”的 unix 环境变量的 .dat 文件还是 .txt 文件。

例如:如果 filetype='TXT' 或 'DAT' 则将输入文件(如 'abc.dat' 或 'abc.txt')读入新的 Pandas 数据框并重命名 2 列。我希望它很清楚。

这就是我所做的。我创建了一个函数来检查文件类型是“dat”还是“txt”并将文件读入熊猫数据帧,然后我重命名了 2 列。该函数正在加载数据,但没有根据需要重命名列。感谢有人能指出我遗漏了什么。

filetype=os.environ['TYPE']
print(filetype)
DAT

    def load(file_type):
        if file_type.lower()=="dat":
            df=pd.read_csv(input_file,sep=',',engine='python')
            if df.columns[0]=="LN_ID":
                df.columns[0]="new_ln_id"
            if df.columns[1]=="LN_DT":
                df.columns[1]="new_ln_dt"
            return(df)
        else:
            if file_type.lower()=="txt":
                df=pd.read_csv("infile",sep=",",engine='python')
                if df.columns[0]=="LN_ID":
                    df.columns[0]="new_ln_id"
                if df.columns[1]=="LN_DT":
                    df.columns[1]="new_ln_dt"
            return(df)
    
    load(filetype)

替代方案

from os import listdir
from os.path import isfile,join
onlyfiles = [f for f in listdir(path) if isfile(join(path,f))]
filename = os.path.join(path,onlyfiles[0])
if filename.endswith('.txt'):
    dte = pd.read_csv(filename,")
elif filename.endswith('.dat'):
    dte = pd.read_csv(filename,")
    
dte.rename(columns={"LN_ID": "new_ln_id","LN_DT": "new_ln_dt"})