我正试图将一堆文本文件(均以制表符分隔(合并为一个文件,并将其保存为CSV格式。有些模式是相同的,但较新文件中的字段并不总是存在于较旧的文件中。此外,我想在每行的最后一列中添加文件名。
所有文件中的字段名称都可能是这样的:
RIAD4097 RIAD4235 RIAD4239
较新的文件可能有这个(这些在较旧的文件中丢失(:
RIADJA28 RIADKW02
这是我正在测试的代码,但我遇到了一个错误。
import os, glob
import pandas as pd
path = "C:\Users\ryans\OneDrive\Desktop\schemas\"
all_files = glob.glob(os.path.join(path, "*.txt"))
all_df = []
for f in all_files:
df = pd.read_csv(f, delimiter='t')
f['file'] = f.split('/')[-1]
all_df.append(df,f)
merged_df = pd.concat(all_df, ignore_index=True, sort=True)
df_merged.to_csv("C:\Users\ryans\OneDrive\Desktop\merged.csv")
这行抛出一个错误。
f['file'] = f.split('/')[-1]
错误为:
类型错误:"str"对象不支持项目分配
我正在尝试获取每行最后一列中列出的文件名。
根据我的研究,我认为append方法应该有效,我认为concat方法也可以作为一种替代方法。有没有一种更喜欢的方式来做这种事情?谢谢
使用os.path.basename(f)
提取文件名。并保存一个用[]
而不是用list.append
分配的新列。
import os
...
all_df = []
for f in all_files:
df = pd.read_csv(f, delimiter='t')
df['file'] = os.path.basename(f) # NEW COLUMN
all_df.append(df)
df_append = pd.concat(all_df, ignore_index=True, sort=True)
df_append.to_csv("C:\Users\ryans\OneDrive\Desktop\merged.csv")
更好地使用assign
的列表理解来添加新列:
all_df = [(pd.read_csv(f, delimiter='t')
.assign(file=os.path.basename(f)) for f in all_files]
df_append = pd.concat(all_df, ignore_index=True, sort=True)
df_append.to_csv("C:\Users\ryans\OneDrive\Desktop\merged.csv")