Python 合并csv文件,将原始文件名添加到输出文件中的每一行
我在一个文件夹中有多个具有相同数据结构的csv文件Python 合并csv文件,将原始文件名添加到输出文件中的每一行,python,csv,merge,Python,Csv,Merge,我在一个文件夹中有多个具有相同数据结构的csv文件 0.00;1.05;10.5 0.01;2.05;15.5 0.02;3.05;20.5 ... 我希望将所有csv文件合并到一个摘要文件中,并在原始数据源上的每一行都添加一个具有文件名的列 0.00;1.05;10.5;csv1.csv 0.01;2.05;15.5;csv1.csv 0.02;3.05;20.5;csv1.csv 0.00;5.05;0.05;csv2.csv 0.01;6.05;1.05;csv2.csv 0.02;7.
0.00;1.05;10.5
0.01;2.05;15.5
0.02;3.05;20.5
...
我希望将所有csv文件合并到一个摘要文件中,并在原始数据源上的每一行都添加一个具有文件名的列
0.00;1.05;10.5;csv1.csv
0.01;2.05;15.5;csv1.csv
0.02;3.05;20.5;csv1.csv
0.00;5.05;0.05;csv2.csv
0.01;6.05;1.05;csv2.csv
0.02;7.05;2.05;csv2.csv
...
我设法合并了文件,但找不到添加文件名的方法
files = []
for file in os.listdir(folder):
if file.endswith('.csv'):
files.append(file)
with open('results.csv', 'w', newline='') as fw:
cw = csv.writer(fw)
for file in files:
with open(file, newline='') as f:
cr = csv.reader(islice(f,13,None)
cw.writerows(cr)
由于ram的限制,我不想使用pandas concat。
谢谢。您可以使用
os
和pandas
:
导入操作系统
作为pd进口熊猫
basedir=
所有_dfs=[]
对于筛选器中的文件名(lambda f:os.path.splitext(f)[1]='.csv',下一步(os.walk(basedir))[2]):
curr_df=pd.read_csv(os.path.join(basedir,文件名),sep=';',header=None)
curr_df['filename']=文件名
所有dfs.append(当前df)
pd.concat(所有dfs,轴=0)。到csv('merged_cvs.csv',sep=';',header=False,index=False)
或者,如果您只喜欢一行:
pd.concat([pd.concat((df,pd.DataFrame([f代表uu范围内(len(df))])),轴=1)代表f,df范围内
((文件名,pd.read_csv(os.path.join(basedir,文件名),sep=';',header=None))
对于筛选器中的文件名(lambda f:os.path.splitext(f)[1]=='.csv',下一步(os.walk(basedir))[2]))
]).to_csv('merged_cvs.csv',sep=';',header=False,index=False)
文件=[]
对于os.listdir(文件夹)中的文件:
如果文件.endswith('.csv'):
追加(文件)
打开('results.csv','w',换行符='')作为fw:
cw=csv.writer(fw)
对于文件中的文件:
打开(文件,换行符=“”)为f时:
write(f“{file}\n”)#只需在内容之前写入文件名:)
cr=csv.reader(islice(f,13,无)
连续写入窗口(cr)
您不需要解析输入的csv文件,只需在每行添加一个分隔符,然后添加当前文件名。您可以使用以下模块:
关于您的代码,您可以这样修复它:
import os
import csv
folder = '.'
files = []
for file in os.listdir(folder):
if file.endswith('.csv'):
files.append(file)
with open('results.csv', 'w', newline='') as fw:
cw = csv.writer(fw, delimiter=';')
for file in files:
with open(file, newline='') as f:
for row in csv.reader(f, delimiter=';'):
row.append(file)
cw.writerow(row)
此处,
分隔符
参数设置为分号,因为默认分隔符是逗号,并且您的文件使用的是;
。这将修复对输入csv文件的正确解析,并对输出文件使用;
。然后通过读取每一行并将文件名附加到行列表中来处理每个输入文件。Finally新行被写入到输出CSV文件。您好,谢谢。但是我得到了一个错误:TypeError:write()参数必须是str,而不是bytes
现在应该可以工作了
import os
import csv
folder = '.'
files = []
for file in os.listdir(folder):
if file.endswith('.csv'):
files.append(file)
with open('results.csv', 'w', newline='') as fw:
cw = csv.writer(fw, delimiter=';')
for file in files:
with open(file, newline='') as f:
for row in csv.reader(f, delimiter=';'):
row.append(file)
cw.writerow(row)