【问题标题】:Joining two csv files after I've used dictreader使用 dictreader 后加入两个 csv 文件
【发布时间】:2011-10-07 23:20:30
【问题描述】:

我是 Python 新手,我正在尝试获取大约 30 个 csv 文件,它们都具有相同的标题,但每个文件中的数据不同,并合并为一个。 现在我假装我只有两个文件要接收,一个包含关于 ID 号 1,2 和 3 的信息,另一个包含关于 4,5 和 6 的信息 到目前为止,我已经设法将文件放入并使用 dictreader 创建了一堆具有相同键的字典,但我无法弄清楚如何获取与每个键对应的值并将它们加入一个大文件将所有数据放在一起。

到目前为止,我已经走了多远 :)

for filename in os.listdir(os.getcwd()):
  root, ext = os.path.splitext(filename)
  if root.startswith('file1') and ext == '.csv':
      upload1 = filename
  if root.startswith('file2') and ext == '.csv':
      upload2 = filename

file_upload1 = open(upload1, 'rU')
data_upload1 = csv.DictReader(file_upload1)

for row in data_upload1:
  print row

上传 2 也是如此。然后我得到这样的输出;

{'ID': '1', 'name': 'bert', 'age': '30'}
{'ID': '2', 'name': 'ernie', 'age': '40'}
{'ID': '3', 'name': 'pinky', 'age': '50'}
{'ID': '4', 'name': 'perky', 'age': '60'}
etc

我想做的是一个 csv 文件,其中一列用于 ID 1、2、3、4、5、6,然后一列用于每个对应的名称,以及每个对应的年龄等。

有人可以建议我如何实现这一目标吗? 很抱歉这个菜鸟问题。

【问题讨论】:

    标签: dictionary export-to-csv opencsv


    【解决方案1】:

    当您调用 csv.DictReader() 时,您将获得一个 dicts 生成器。假设我们有 2 个文件:“f1.csv”和“f2.csv”,每个文件都包含多条记录。

    
        import csv
    
        fp1, fp2 = open("f1.csv"), open("f2.csv")
        ld1, ld2 = csv.DictReader(fp1), csv.DictReader(fp2) #ld1 and ld2 are *generators*
    
        res = []  #our result will be stored here(LIST of dicts)
        ds = [ld1, ld2]    #list of generators
    

    然后,遍历 ds,同时将每个 dict 中的每个 k-v 对添加到 res dict,如下所示:

    for d in ds: #each d is a generator
        for e in d: #each e is a dict
            res.append(e)
    

    这个 res 现在是一个列表,其中包含来自两个来源的 dicts。只需遍历它并编写它们。

    请注意,您可以使代码更加健壮/高效,但首先要了解方法:)

    问候,

    亚提萨加德

    【讨论】:

    • 嗨!非常感谢您回答我的问题!我尝试了您的建议,但出现以下错误。你知道我做错了什么吗?与如何使用 dictreader 创建对象有关?回溯(最后一次调用):文件“merge_bulk_v2.py”,第 30 行,在 res[key] = d[key] AttributeError: DictReader instance has no attribute 'getitem' 再次感谢为您的帮助:)
    • 我认为您感到困惑 :) 请参阅 DictReader() 为您提供了一个类似对象的生成器,您可以对其进行迭代。我猜我的回答有点过于简单了。我会编辑答案。
    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 2012-07-31
    • 2019-09-14
    • 1970-01-01
    • 2017-07-09
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多