【问题标题】:AttributeError: 'tuple' object has no attribute, merging csvAttributeError:“元组”对象没有属性,正在合并 csv
【发布时间】:2019-03-26 07:23:16
【问题描述】:

我在一个文件夹中有多个.csv 文件,它们具有相同的结构。 前两列包含两个值k1k2,第三列包含一个数值。 我想对这些文件进行迭代并将它们合并到一个新的csv 中,其中我将有K1K2 的前两列,然后是n 列,每个n 文件都有一个列。 这是我的解决方案:

import glob
import csv
import os

def get_data(filename):
    '''function to read the data form the input csv file to use in the analysis'''
    with open(filename, 'r') as f:
        reader = csv.reader(f)                      
        result = {tuple(row[:2]): row[2] for row in reader}
        return result   

path='mypath' 
for infile in glob.glob(os.path.join(path, '*.csv')):

    print ("Current File Being Processed is:  " + infile) 
    #use split to seperate the path and name of the file
    (PATH, FILENAME) = os.path.split(infile)
    all_data=[]
    #adds the data from the csv file to a blank list so it can be operated on
    all_data.extend(get_data(infile))

result = {}

for dic in all_data:
    for key in (dic.viewkeys() | result.keys()):
        if key in dic: result.setdefault(key, []).append(dic[key])
        else: result.setdefault(key, []).append(0)


with open('mypath', 'w') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=csv_columns)
        writer.writeheader()
        for data in result:
            writer.writerow(data)

但它会返回

Traceback (most recent call last):
  File "C:\Users\Desktop\p.py", line 26, in <module>
    for key in (dic.viewkeys() | result.keys()):
AttributeError: 'tuple' object has no attribute 'viewkeys'

【问题讨论】:

  • 你在用jupyter吗?
  • 不,我正在研究 Python IDLE

标签: python csv merge


【解决方案1】:
    result = {tuple(row[:2]): row[2] for row in reader}

您将 key 存储为 tuple(key) 并因此对其进行迭代会为您抛出错误。

【讨论】:

  • 他正在创建一个以元组为键的字典并将该字典放入列表中,因此他有类似 [{(.....):[.....]}] 的内容。因此,他在循环中的 dic 变量实际上应该指向一个字典。
  • 谢谢。有什么可能的替代解决方案?
  • @FlorianH 不,他们正在执行 all_data.extend(get_data(infile)) 迭代 get_data 返回的字典中的元组,将它们添加到列表中,因此它将是一个元组列表。
  • @ds1993 也许你的意思是all_data.append(get_data(infile))
  • @juanpa.arrivillaga 我可能不清楚 append 和 extend 之间的区别。我读到如果我有 x = [1, 2, 3] 并且我使用 x.append([4, 5]) 它应该返回类似 [1, 2, 3, [4, 5]] 的东西,而 extend 应该返回类似 [1, 2, 3, 4, 5] 的内容,然后我认为 extend 对我来说是正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 2021-07-30
  • 2013-07-29
  • 2020-08-29
  • 2015-04-22
  • 2019-04-27
相关资源
最近更新 更多