将多个csv文件合并为一个csv文件

时间:2019-05-24 14:15:33

标签: python csv concatenation export-to-csv

我正在尝试将多个csv文件合并为一个,并尝试了多种方法,但我一直在努力。

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

我已经尝试过为该文件编写close语句,但仍然得到相同的结果,我指定的组合式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)

3 个答案:

答案 0 :(得分:0)

您的文件是否具有相同的结构?如果不是不一致的话,他们需要具有以下信息才能加入。如果它不是变量,则可以映射数据以生成最终文件。

在您的代码上,这是正确的,但是如果您使用的是类似Unix的操作系统(Linux,MacOS等),则可以简单地使用“ cat”命令来合并文件,但是如果几个具有不同结构的文件,因此python将是完美的。但是对于这种情况,您的代码将需要进行一些修改。

答案 1 :(得分:0)

您的代码对我有用。

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

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")

答案 2 :(得分:0)

考虑一些调整:

  1. 使用上下文管理器with进行读写过程。这样可以避免close()个文件对象,而您不需要对read个对象进行操作。
  2. 要跳过行问题:请使用newline=''中的参数open()lineterminator="\n"中的csv.writer()参数。请参见formerlatter的答案。
  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(Avg_Dir + '.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)