如何附加多个 CSV 文件并在 Python 中添加指示文件名的附加列?

Posted

技术标签:

【中文标题】如何附加多个 CSV 文件并在 Python 中添加指示文件名的附加列?【英文标题】:How to append multiple CSV files and add an additional column indicating file name in Python? 【发布时间】:2019-06-07 22:26:01 【问题描述】:

我在一个文件夹中有 20 多个 CSV 文件。所有文件都具有相同的结构,它们只是代表不同的日子。

例子:

Day01.csv

Day02.csv

Day03.csv

Day04.csv(等等...)

这些文件只包含两个数字列:x 和 y。我想将所有这些 csv 文件一起附加到一个大文件中,并为文件名(天)添加一列。我已经探索了类似的示例来生成以下代码,但是此代码将每个 y 添加到单独的列(Y1、Y2、Y3、Y4 ......等等)。我想简单地将这个附加文件作为三列:x、y、文件名。如何修改代码以进行正确的附加?

我已经尝试过此示例中的代码:Read multiple csv files and Add filename as new column in pandas

import pandas as pd
import os
os.chdir('C:....path to my folder')
files = os.listdir()
df = pd.concat([pd.read_csv(fp).assign(New=os.path.basename(fp)) for fp in files])

但是,此代码不会将所有 Y 值附加到一列下。 (但是,所有其他方面似乎都有效)。有人可以帮助编写代码,使所有 Y 值都在一个列下吗?

【问题讨论】:

使用 Unix 命令行工具有一个更快的解决方案 逐步构建您的解决方案,因此 a) 编写一个程序,该程序读取一个文件并使用您添加的列写入一个新文件(例如读取一行,按字符串添加新列并写入)b)取出读取的部分并将其包装到返回要写入的行的函数中。 c) 打开要写入的文件 d) 对要读取的文件进行循环,然后将新行写入最终文件。使用 vanilla python 可以轻松完成所有这些操作,无需任何额外的库 有支持此功能的开源工具,根据您的情况/目标,它们可能是一种选择。一个是csvstack from csvkit。另一个是tsv-append from eBay's tsv utilities。 (免责声明:我是作者。)可能还有其他工具支持此功能。 @RomanPerekhrest 没错,cat Day*.csv > AllDays.csv。 If the only tool you have is pandas, everything will look like a DataFrame. 【参考方案1】:

python 非常擅长这些简单的任务,几乎好得令人难以置信……

fake_files = lambda n: '\n'.join(('%d\t%d'%(i, i+1) for i in range(n, n+3)))

file_name = 'fake_me%s.csv'

with open('my_new.csv', 'wt') as new:
    for number in range(3): # os.listdir()
#        with open(number) as to_add:
#            rows = to_add.readlines()
            rows_fake = fake_files(number*2).split('\n')
            adjusted_rows = [file_name%number + '\t' + row for row in rows_fake]
            new.write('\n'.join(adjusted_rows) + '\n')

通过调整您的特定 io 和命名,这就是您所需要的。 您可以复制代码并运行它并研究它是如何工作的。

【讨论】:

【参考方案2】:

在将dataframe 附加到您的列表之前,应通过创建filename 列来实现以下操作。

import os
import pandas as pd

file_list = []
for file in os.listdir():
    if file.endswith('.csv'):
        df = pd.read_csv(file,sep=";")
        df['filename'] = file
        file_list.append(df)

all_days = pd.concat(file_list, ignore_index=True)
all_days.to_csv("all.txt")

【讨论】:

谢谢!这有帮助!我能够让它工作!干杯! :-)

以上是关于如何附加多个 CSV 文件并在 Python 中添加指示文件名的附加列?的主要内容,如果未能解决你的问题,请参考以下文章

无论如何要在这个python程序中添加一堆csv文件的输入?我想搜索超过 15 个 csv 文件

如何附加来自多个 csv 文件的值?

如何在循环中附加多个熊猫数据框?

如何在不使用 Java 的情况下压缩 .csv 文件并在电子邮件中附加 Oracle plsql

在一个标题下按列附加到 csv 文件

csv在python中写数组到文件,如何删除附加行[复制]