【问题标题】:Python - merging of csv files with one axis in commonPython - 合并具有一个共同轴的 csv 文件
【发布时间】:2013-12-16 21:03:33
【问题描述】:

我需要合并两个csv文件,A.csvB.csv,有一个共同的轴,提取:

9.358,3.0
9.388,2.0

8.551,2.0
8.638,2.0

我希望最终文件 C.csv 具有以下模式:

8.551,0.0,2.0
8.638,0.0,2.0
9.358,3.0,0.0
9.388,2.0,0.0

你建议怎么做?我应该使用 for 循环吗?

【问题讨论】:

    标签: python csv


    【解决方案1】:

    这是一个使用字典的简单解决方案,它适用于任何个文件:

    from __future__ import print_function
    
    def process(*filenames):
        lines = {}
        index = 0
        for filename in filenames:
            with open(filename,'rU') as f:
                for line in f:
                    v1, v2 = line.rstrip('\n').split(',')
                    lines.setdefault(v1,{})[index] = v2
            index += 1
        for line in sorted(lines):
            print(line, end=',')
            for i in range(index):
                print(lines[line].get(i,0.0), end=',' if i < index-1 else '\n')
    
    process('A.csv','B.csv')
    

    打印

    8.551,0.0,2.0
    8.638,0.0,2.0
    9.358,3.0,0.0
    9.388,2.0,0.0
    

    【讨论】:

    • 我收到了错误print(line, end=',') ^ SyntaxError: invalid syntax
    • 对我来说很好用...你使用的是 Python 2 还是 3?
    【解决方案2】:

    只需从每个文件中读取,写入输出文件并添加到“缺失”列中:

    import csv
    
    with open('c.csv', 'wb') as outcsv:
        # Python 3: use open('c.csv', 'w', newline='') instead
        writer = csv.writer(outcsv)
    
        # copy a.csv across, adding a 3rd column
        with open('a.csv', 'rb') as incsv:
            # Python 3: use open('a.csv', newline='') instead
            reader = csv.reader(incsv)
            writer.writerows(row + [0.0] for row in reader)
    
        # copy b.csv across, inserting a 2nd column
        with open('b.csv', 'rb') as incsv:
            # Python 3: use open('b.csv', newline='') instead
            reader = csv.reader(incsv)
            writer.writerows(row[:1] + [0.0] + row[1:] for row in reader)
    

    writer.writerows() 行完成所有工作;生成器表达式循环遍历每个 reader 中的行,在中间追加一列或插入一列。

    这适用于您拥有的任何大小的输入 CSV,因为只有一些读写缓冲区保存在内存中。行以迭代方式处理,无需将所有输入或输出文件保存在内存中。

    【讨论】:

    • 谢谢! a.csv 一切正常,但b.csv 不行:我只得到了第一行和零,但没有第二行...
    • @albus_c:我的初始版本没有使用切片;你在使用我最近的编辑吗?
    • 是的,我在处理b.csv时仍然错过了一列数据
    • @albus_c: 你能用a.csvb.csv 的样本和生成的输出创建一个paste 或gist 吗?我怀疑您的 b.csv 文件有问题,因为它没有正确读取。您也可以尝试打开 just b.csv 并打印每一行 (for row in reader: print row) 并查看是否正常工作。
    • 我重新编译了几次,现在一切正常;)谢谢!
    【解决方案3】:
    import numpy as np
    
    dat1 = np.genfromtxt('dat1.txt', delimiter=',')
    dat2 = np.genfromtxt('dat2.txt', delimiter=',')
    
    dat1 = np.insert(dat1, 2, 0, axis=1)
    dat2 = np.insert(dat2, 1, 0, axis=1)
    
    dat = np.vstack((dat1, dat2))
    
    np.savetxt('dat.txt', dat, delimiter=',', fmt='%.3f')
    

    【讨论】:

      猜你喜欢
      • 2021-10-04
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2013-04-15
      • 2022-07-04
      • 1970-01-01
      • 2017-10-07
      相关资源
      最近更新 更多