将许多txt / csv文件编译为单个数据帧,并将文件名添加为一列

时间:2018-08-17 16:44:37

标签: python list pandas csv glob

我正在努力编译许多文件,同时将文件名添加为结果数据框中的一列。以下脚本可以运行,但是以某种方式只对单个文件执行操作...为什么不将所有文件放在一起?

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())。

1 个答案:

答案 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)