【问题标题】:How to merge multiple text files into one csv file in Python如何在 Python 中将多个文本文件合并为一个 csv 文件
【发布时间】:2020-07-10 13:58:22
【问题描述】:

我正在尝试将 200 个文本文件转换为 csv 文件。我正在使用下面的代码,我可以运行它,但它不会生成 csv 文件。谁能告诉任何简单快捷的方法?非常感谢

dirpath = 'C:\Files\Code\Analysis\Input\qobs_RR1\\'
output = 'C:\Files\Code\Analysis\output\qobs_CSV.csv'
csvout = pd.DataFrame()
files = os.listdir(dirpath)

for filename in files:
    data = pd.read_csv(filename, sep=':', index_col=0, header=None)
    csvout = csvout.append(data)

csvout.to_csv(output)

【问题讨论】:

  • 你为什么不使用python的open方法,打开文件并用新的扩展名编写它。您还可以使用 pathlib 的 with_suffix 方法将扩展名从 txt 更改为 csv。我不知道你为什么要改变它,但试试我的建议,因为它们提供了更多的粒度,甚至会更快,因为它只是后缀的改变。另外,顺便说一句,在你的程序中,它不喜欢 for 循环缩进后的代码。
  • 您需要包含 200 个单独 csv 文件的单个 csv 文件吗?您的代码与您的问题标题不匹配。

标签: python python-3.x pandas python-2.7 numpy


【解决方案1】:

问题是您的os.listdir 为您提供了dirpath 内的文件名列表,而不是这些文件的完整路径。您可以通过使用 os.path.join 函数将 dirpath 添加到文件名来获取完整路径。

import os
import pandas as pd

dirpath = 'C:\Files\Code\Analysis\Input\qobs_RR1\\'
output = 'C:\Files\Code\Analysis\output\qobs_CSV.csv'
csvout_lst = []
files = [os.path.join(dirpath, fname) for fname in os.listdir(dirpath)]

for filename in sorted(files):
    data = pd.read_csv(filename, sep=':', index_col=0, header=None)
    csvout_lst.append(data)

pd.concat(csvout_lst).to_csv(output)

编辑:这可以通过单行来完成:

pd.concat(
    pd.read_csv(os.path.join(dirpath, fname), sep=':', index_col=0, header=None)
    for fname in sorted(os.listdir(dirpath))
).to_csv(output)

编辑 2: 更新了答案,因此文件列表按字母顺序排序。

【讨论】:

  • 我只想在这里补充一点,使用glob 是在目录中导航和检索文件的绝妙方法。尤其是这里只看 csvs:import glob; filenames = glob.glob(dirpath+"*.csv")
  • @Arnaud,同意 - 我没有包含它,因为根据我的观察,Windows 平台上的人们倾向于在他们的代码中避免它。
  • 对,我也是这么告诉自己的。
  • @ taras 谢谢它确实有效,但在 csvout_lst 它随机生成 csv 我实际上想要与输入文件夹中相同顺序的数据帧列表,以便识别特定文件,例如我有名称为 105 的文本文件, 120 ,144 等我想要 csvout_lst 中的相同序列。有什么办法吗?
  • @SumraMushtaq,当然-您只需要对文件列表进行排序。查看更新的答案
猜你喜欢
  • 2017-08-17
  • 2014-05-17
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多