【问题标题】:Combining multiple csv files into one csv file将多个 csv 文件合并为一个 csv 文件
【发布时间】:2019-10-11 03:55:59
【问题描述】:

我正在尝试将多个 csv 文件合并为一个,并尝试了多种方法,但我很挣扎。

我从多个 csv 文件导入数据,当我将它们一起编译成一个 csv 文件时,前几行似乎填写得很好,但随后它开始在行之间随机输入可变数字的空格,并且它永远不会完成组合的 csv 文件的填写,它似乎只是不断地向其中添加信息,这对我来说没有意义,因为我正在尝试编译有限数量的数据。

我已经尝试为该文件编写关闭语句,但我仍然得到相同的结果,我指定的组合 csv 文件永远不会停止获取数据,它会在整个文件中随机分配数据 - 我只想要一个正常编译的 csv .

我的代码有错误吗?有什么解释为什么我的 csv 文件会这样吗?

csv_file_list = glob.glob(Dir + '/*.csv') #returns the file list
print (csv_file_list)
with open(Avg_Dir + '.csv','w') as f:
    wf = csv.writer(f, delimiter = ',')
    print (f)
    for files in csv_file_list:
        rd = csv.reader(open(files,'r'),delimiter = ',')
        for row in rd:
            print (row)
            wf.writerow(row)

【问题讨论】:

  • 您确定要合并的 csv 文件末尾没有空格吗?此外,如果您有很多包含很多行的文件,可能只是需要很长时间才能运行,这就是为什么它似乎永远不会停止获取数据的原因。
  • @iamchoosinganame 文件最后没有空白空间,合并后的文件应该约为 46,000 KB,但是当我运行程序时,有时甚至在我终止程序之前达到 5,000,000 KB,因为我知道有问题

标签: python csv concatenation export-to-csv


【解决方案1】:

你的代码对我有用。

或者,您可以按如下方式合并文件:

csv_file_list = glob.glob(Dir + '/*.csv')
with open(Avg_Dir + '.csv','w') as wf:
    for file in csv_file_list:
        with open(file) as rf:
            for line in rf:
                if line.strip(): # if line is not empty
                    if not line.endswith("\n"):
                        line+="\n"
                    wf.write(line)

或者,如果文件不是太大,您可以一次读取每个文件。但在这种情况下,所有空行都会复制标题:

csv_file_list = glob.glob(Dir + '/*.csv')
with open(Avg_Dir + '.csv','w') as wf:
    for file in csv_file_list:
        with open(file) as rf:
            wf.write(rf.read().strip()+"\n")

【讨论】:

  • 这解决了我的间距问题,谢谢!现在数据都很好地格式化在一起 - 但仍然存在一个问题:它似乎永远不会完成组合 csv 文件的填充:它只是组合起来应该是 46,000 KB,但它永远不会停止作为一个文件增长,所以我很困惑.你知道这是为什么吗?
  • 如何限制合并文件?没有您的数据,回答您的问题非常复杂
  • 这是唯一的代码块,除了我链接到 Dir 和 Avg_Dir 之外,没有其他进程你看不到。 Dir 链接到包含多个 csv 文件(仅此而已)的文件,Avg_Dir 链接到具有单个 csv 文件的文件,该文件被用作包含所有组合数据的 csv 文件@Parfait
  • ^我也回答了你的问题我认为@Aray
  • 下一个问题:如何运行 Python 脚本?通过 IDE、命令行、网络笔记本?尝试在命令行运行以避免环境问题:python myscript.py"C:\path\to\bin\python.exe" "C:\path\to\myscript.py"
【解决方案2】:

考虑几个调整:

  1. 对读写过程都使用上下文管理器with。这避免了对 close() 文件对象的需要,而您不会对 read 对象执行此操作。
  2. 对于跳行问题:使用open() 中的参数newline=''csv.writer() 中的lineterminator="\n" 参数。请参阅formerlatter 的 SO 答案。
  3. 使用os.path.join() 正确连接文件夹和文件路径。此方法与操作系统无关,因此适用于使用正斜杠或反斜杠类型的 Windows 或 Unix 机器。

调整后的脚本:

import os
import csv, glob

Dir = r"C:\Path\To\Source"
Avg_Dir = r"C:\Path\To\Destination\Output"

csv_file_list = glob.glob(os.path.join(Dir, '*.csv')) # returns the file list
print (csv_file_list)

with open(os.path.join(Avg_Dir, 'Output.csv'), 'w', newline='') as f:
    wf = csv.writer(f, lineterminator='\n')

    for files in csv_file_list:
        with open(files, 'r') as r: 
            next(r)                   # SKIP HEADERS
            rr = csv.reader(r)
            for row in rr:
                wf.writerow(row)

【讨论】:

  • 谢谢,这对编译数据和删除标题有很大帮助——我仍然对我的组合 csv 文件如何从不停止添加数据有疑问。我不认为这是代码的问题 - 我认为这可能是我们的 csv 文件如何保存到计算机的问题,我将对此进行调查。但是谢谢你,你的代码肯定帮了很多忙
  • 这个解决方案非常适合我使用 10 个 50 行的 csv 文件在 Windows 机器上输出 1 个 500 行的 csv。希望你能找到你的问题。祝你好运!
  • 刚刚运行命令,在我的 Windows 机器上使用 16 个 csv 文件(总共 1.25 GB)没有得到任何输出。
  • 控制台输出还是单个 CSV 输出? print 是否输出了 csv 文件列表?
  • 只需在open的文件名中添加路径:with open(os.path.join(mydestinationfolder, 'Output.csv'), 'w', newline='')
猜你喜欢
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多