【问题标题】:How to merge four CSVs in Python?如何在 Python 中合并四个 CSV?
【发布时间】:2021-05-15 18:09:14
【问题描述】:

我有 4 个 csv 文件,我想使用 python 语言将它们组合成单个 csv 文件。例如,

csv1

身份证姓名年龄

csv2

id学位阶段

csv3

id 颜色车

csv4

id 电视游戏

我想将它们合并到 csv 文件中:

id姓名年龄程度舞台彩车电视游戏

这是我的简单代码,但我不工作。请帮忙

import csv

reader = csv.reader(open('output1.csv', 'rb'))
reader1 = csv.reader(open('output2.csv', 'rb'))
reader2 = csv.reader(open('output3.csv', 'rb'))
reader3 = csv.reader(open('output4.csv', 'rb'))
writer = csv.writer(open('appended_output.csv', 'wb'))
for row in reader:
    row1 = reader1.next()
    row2 = reader2.next()
    row3 = reader3.next()
    writer.writerow(row + row1 + row2 + row3)

【问题讨论】:

    标签: python sqlite csv merge


    【解决方案1】:

    csv.reader 返回一个可迭代对象,因此您应该使用 next(readerx) 而不是 readerx.next

    for row in reader:
        row1 = next(reader1)
        row2 = next(reader2)
        row3 = next(reader3)
        writer.writerow(row + row1 + row2 + row3)
    

    或者你可以像建议的here那样使用熊猫

    除了您将使用pandas.read_csvDataFrame.to_csv 来使用CSV 而不是excel 格式。

    处理不同大小的表格

    上述方法的一个限制是,由于行是单独连接的,如果一个表有不同长度的行,它会弄乱右边的列。其他限制是,如果表有不同的行数,如果任何表短于output1.csv,如果任何表长于output1.csv,则某些行将丢失。下面的代码通过填充空单元格来解决这些限制。这种方法的局限性在于表必须加载到内存中。

    def make_uniform_rows(table, numrows, empty=''):
        '''
          Given a table as a list of lists, produces an output
          ensuring that all lists have the same length
          filling the empty cells
        '''
        out = []
        ncols = max(len(row) for row in table)
        for i in range(table, numrows):
            row = table[i] if i < len(table) else []
            row += [empty] * (ncols - len(row))
            out.append(row);
        return out;
    
    def concatenate_tables(readers):
        # load everything to memory
        tables = [list(reader) for reader in readers];
        # determine the number of rows of the bigger csv
        numrows = max(len(table) for table in tables)
        
        return make_uniform_rows(tables, numrows)
        
        
    reader0 = csv.reader(open('output1.csv', 'rb'))
    reader1 = csv.reader(open('output2.csv', 'rb'))
    reader2 = csv.reader(open('output3.csv', 'rb'))
    reader3 = csv.reader(open('output4.csv', 'rb'))
    writer = csv.writer(open('appended_output.csv', 'wb'))
    
    
    for row in concatenated_tables([reader0, reader1, reader2, reader3]):
        writer.writerow(row + row1 + row2 + row3)
    

    【讨论】:

    • 感谢 user12750353 的回答,但是,您的回答给了我这个消息错误:row2 = next(reader2) StopIteration
    • 表示 reader2 的行数比 reader 少。也许你想填补空白。
    • 解决的限制
    猜你喜欢
    • 2011-01-31
    • 2019-11-19
    • 2020-11-25
    • 2019-03-27
    • 2014-07-06
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多