我正在努力编译许多文件,同时将文件名添加为结果数据框中的一列。以下脚本可以运行,但是以某种方式只对单个文件执行操作...为什么不将所有文件放在一起?
import glob
import pandas as pd
import os
# format Working but only reads 1 file
indir = "C:\\location\test"
outfile = "C:\\location\test\output.csv"
# Change the directory to where the files are located
os.chdir(indir)
# Make an empty list
filelist = []
# Populate list with filenames. structure criteria with wild cards
for files in glob.glob('*.txt'):
filelist.append(files)
print(filelist) # so far so good, all files are in the list
# apply a for loop to the files listed above by glob
for files in filelist:
# built up dataframes and append the filepath as a column
frame = [pd.read_csv(files, skiprows=21, header=None,
delim_whitespace=True).assign(Filename=os.path.basename(files))]
df = pd.concat(frame, ignore_index=True)
df.columns = ['Wavelength', 'Value', 'Filename']
df.to_csv(outfile, index=None)
print(df)
我知道已经有一些线程正在处理类似的问题,但是这些线程使我以某种方式进入了这个特定的砖墙。
顺便说一句,源文件的形状是2256行乘以两列(“波长”和“值”),并且现在我在Filename列中添加assign(Filename = os.path.basename())。
答案 0 :(得分:1)
您正在将for
循环与列表理解结合/混淆。选择一个或另一个(而不是两个)来迭代filelist
。另外,您的串联应该发生在for
循环或列表理解之外。
例如,您可以在此处使用列表理解,然后将其输入pd.concat
:
filelist = list(glob.glob('*.txt'))
frames = [pd.read_csv(fp, skiprows=21, header=None, delim_whitespace=True)\
.assign(Filename=os.path.basename(fp)) for fp in filelist]
df = pd.concat(frames, ignore_index=True)
df.columns = ['Wavelength', 'Value', 'Filename']
df.to_csv(outfile, index=None)