将 60K csv 的输出合并并写入一个 csv

Posted

技术标签:

【中文标题】将 60K csv 的输出合并并写入一个 csv【英文标题】:Merge & write output of 60K csv to one csv 【发布时间】:2017-10-25 09:12:18 【问题描述】:

我正在尝试将 30K csvs 合并到具有相同标题的目录中,并且我想将它们合并到一个文件中。使用下面的代码,我只能合并但具有相同的标题,并且我不想在添加新文件之后重复标题。

import pandas as pd
f = r'path/*.csv
combined_csv = pd.concat([ pd.read_csv(f) for f in filenames ])

combined_csv.to_csv('output.csv', index=False, header=True)

错误:

Traceback (most recent call last):
  File "merg_csv.py", line 4, in <module>
    combined_csv = pd.concat([ pd.read_csv(f) for f in filenames ])
NameError: name 'filenames' is not defined

编辑:以下答案中提供的解决方案有效,但一段时间后内存被使用,程序冻结并冻结我的屏幕。

import glob
import pandas as pd 

all_data = pd.dataFrame()

dfs = []

for f in glob.glob("*.csv"):
    df = pd.read_csv(f, error_bad_lines=False)

    dfs.append(df)

all_data = pd.concat(dfs, ignore_index=True)

all_data.to_csv("00_final.csv", index=None, header=True)

如何同时合并和写入输出文件,这样我就不会遇到内存不足的错误。输入的大小约为1.5gb,文件数超过60K

提前致谢!!

【问题讨论】:

您遇到了什么问题? @pvg 更新了问题.. 更改了代码和错误 这与熊猫或标题没有任何关系。似乎您想要 glob 该模式,然后迭代它生成的文件名。你应该看看如何做到这一点,因为你尝试它的方式不是它。 见***.com/questions/3964681/… 和许多其他类似的答案。 【参考方案1】:

您的问题似乎出在for loop。语法不正确。

试试这个:

from glob import glob
all_df = []
for f in glob('path/*.csv'):
    temp_df = pd.read_csv(f)
    all_df.append(temp_df)
final_df = pd.concat(all_df)

【讨论】:

Wen concat 使用了所有的标头。合并后我只需要 csv 中的标头 1 次 pd.concat 不会给你多个标题。我的理解是每个文件都有自己的标题。如果我错了,请纠正我。如果文件没有标题,请告诉我,以便我可以相应地修改代码。 每个文件都有相同的标题..我想将所有这些文件合并到一个大文件中以供将来处理.. 这应该可以。您将只有 1 行(顶行)作为标题。剩下的所有行都将是您的数据。 看起来我有一些错误行,这给了我合并错误。我使用了error_bad_line=False,但这也给出了错误。

以上是关于将 60K csv 的输出合并并写入一个 csv的主要内容,如果未能解决你的问题,请参考以下文章

将多个csv文件导入pandas并合并到一个DataFrame中

如何将 CSV 输出写入标准输出?

将 CSV 写入标准输出或文件名

如何将多个csv按行合并?(不是首尾相接的按列合并)

DT::datatable - 选择要删除的行并写入没有闪亮的 csv

从多个 csv 文件中获取一个特定列并合并为一个