【问题标题】:merge csv files in Python在 Python 中合并 csv 文件
【发布时间】:2015-07-15 11:32:51
【问题描述】:

例如:

输入 csv1:

id,count
1A,9
2A,8
4A,3
6A,5

输入 csv2:

id,count
1A,2
2A,2
3A,1
4A,7

输入 csv3:

id,count
1A,2
5A,1
6A,1
8A,2
9A,1

'id' 在所有 3 个 csv 文件中分布不均,有些显示在 1 个文件中,有些则没有。

我想要的输出 csv 文件如下所示:

output.csv(按 id 汇总计数值)

id,count
1A,13
2A,10
3A,1
4A,10
5A,1
6A,6
8A,2
9A,1

output.csv(按id列出所有计数值,该项目的值0确实存在于相应的csv文件中但存在于其他csv文件中)

id,count1,count2,count3
1A,9,2,2
2A,8,2,0
3A,0,1,0
4A,3,7,0
5A,0,0,1
6A,5,0,1
8A,0,0,2
9A,0,0,1

非常感谢您的帮助。

=======================更新====================

感谢@Lilith 的回答,它解决了问题 1。我修改了代码以额外工作:代码可以处理给定文件夹中的所有 csv 文件,结果 csv 中的行按“计数”值排序.无法获得解决方案,可以稍后尝试。

import os
import csv
from skipdict import SkipDict

data = {}      

def mergeCSV(fileDir,outFile,header1,header2):
    getDataFromAll(fileDir)
    writeCSVDatatToFile(outFile,header1,header2)

def getDataFromAll(fileDir):
    for root, dirs, files in os.walk(fileDir):
        for aFile in files:
            if aFile.endswith(".csv"):
                aFile = os.path.join(root, aFile)
                worker(aFile)

def worker(aFile):
    with open(aFile, 'rb') as csvfile:
        csv_reader = csv.reader(csvfile, delimiter=',', quotechar='|')
        for row in list(csv_reader)[1::]:
            if row[0] in data:
                data[row[0]] += int(row[1])
            else:
                data[row[0]] = int(row[1])

def writeCSVDatatToFile(outFile,header1,header2):
    sorted_data = SkipDict(data)
    with open(outFile, 'w') as csvfile:
        fieldnames = [header1, header2]
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        for key, value in sorted_data.items():
            writer.writerow({header1: key, header2: int(value)})

mergeCSV('/home/csv/','/home/csv/output.csv','id','count')

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为 SO 不是代码编写服务。
  • 您有没有尝试解决这个问题?如果你有,请在你的问题中包含你的代码和研究,以显示什么对你不起作用。如果没有,您应该先尝试自己解决它,然后在此处发布代码和研究。它也让其他人更容易回答您的问题!
  • 你的代码在哪里?你试过什么没用?
  • 很抱歉没有提供代码,因为我无法正确获取代码。我知道这不是代码编写服务,我正在寻求帮助。如果有提供代码,我不会否认;但我也在接受任何可以帮助我解决问题的建议和建议或粗略的想法。在 stackoverflow 帖子中,人们会给出建议或建议,例如“尝试 *** 库,使用字典”等。如果您知道一些事情并想提供帮助,请感谢您;如果你不想帮助或不能帮助,那没关系。但你不必刻薄。

标签: python csv merge


【解决方案1】:

您可以使用 csv.reader 和 csv.writer 执行此操作。 https://docs.python.org/3.5/library/csv.html

第一个示例的代码:

import csv

csv_files = ["1.csv", "2.csv", "3.csv"]

data = {}

for csv_file_name in csv_files:
    with open(csv_file_name, 'rb') as csvfile:
        csv_reader = csv.reader(csvfile, delimiter=',', quotechar='|')
        for row in list(csv_reader)[1::]:
            if row[0] in data:
                data[row[0]] += int(row[1])
            else:
                data[row[0]] = int(row[1])



with open('output.csv', 'w') as csvfile:
    fieldnames = ['id', 'count']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()

    for key, value in data.items():
        writer.writerow({"id": key, "count": value})

【讨论】:

    【解决方案2】:

    使用pandas 非常简单。也适用于 3 个以上的文件。

    csvs = ['1.csv', '2.csv', '3.csv']
    
    dataCollection = []
    
    for item in csvs:
        dataCollection.append = pandas.read_csv(item)
    
    mergedData = reduce(lambda left,right: pandas.merge(left,right,on='id'), dataCollection )
    
    mergedData.sum(axis = 0)
    

    【讨论】:

      猜你喜欢
      • 2020-09-03
      • 2019-10-30
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 2012-11-23
      相关资源
      最近更新 更多