TypeError:不可用类型:' dict'尝试在python中写出CSV时

时间:2015-08-30 00:17:20

标签: python string csv dictionary

我使用的是Jupyter Notebook和Python 3.4。我有一个格式为的数据结构:

[{'AccountNumber': N,
'Amount': '0',
 'Answer': '12:00:00 PM',
  'ID': None,
  'Type': 'WriteLetters',
  'Amount': '10',
  {'AccountNumber': Y,
      'Amount': '0',
      'Answer': ' 12:00:00 PM',       
       'ID': None,
      'Type': 'Transfer',
      'Amount': '2'}]

最终目标是将其写入CSV。

对于上面的示例,输出看起来像:

AccountNumber, Amount, Answer, ID, Type, Amount
N,0,12:00:00 PM,None,WriteLetters,10
Y,2,12:00:00 PM,None,Transfer,2

以下是我用来写出这个数据结构的函数。请原谅任何缩进格式问题。数据结构通过函数construct_results(get_just_xml_data)返回。返回的数据采用上述格式。 construct_headers(get_just_xml_data)返回标头列表。写出headers_list行的行。

列表推导data是删除重复项并维护列标题的完整性以及数据结构的每个新实例的值(其中字典中的键是标题和值 - 行实例) 。此特定数据结构中的键用于检查是否存在值实例,如果没有,则放置''

def write_to_csv(results, headers):

    headers = construct_headers(get_just_xml_data)
    results = construct_results(get_just_xml_data)
    headers_list = list(headers)

    with open('real_csv_output.csv', 'wt') as f:
        writer = csv.writer(f)
        writer.writerow(headers_list)
        for row in results:
            data = [row.get(index, '') for index in results]
        writer.writerow(data)

然而,当我运行它时,我收到此错误:

The end goal is to write this out to CSV. 

对于上面的示例,输出看起来像:

AccountNumber, Amount, Answer, ID, Type, Amount
N,0,12:00:00 PM,None,WriteLetters,10
Y,2,12:00:00 PM,None,Transfer,2

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-744-7746797fc9a5> in <module>()
----> 1 write_to_csv(results, headers)

<ipython-input-743-c822437eeaf0> in write_to_csv(results, headers)
      9         writer.writerow(headers_list)
     10         for item in results:
---> 11             data = [item.get(index, '') for index in results]
     12         writer.writerow(data)

<ipython-input-743-c822437eeaf0> in <listcomp>(.0)
      9         writer.writerow(headers_list)
     10         for item in results:
---> 11             data = [item.get(index, '') for index in results]
     12         writer.writerow(data)

TypeError: unhashable type: 'dict'

我欢迎任何有关可能原因的反馈。

2 个答案:

答案 0 :(得分:1)

您可以使用csv.DictWriter()更轻松地执行此操作:

with open('real_csv_output.csv', 'wt') as f:
    csvw = csv.DictWriter(f, fieldnames=results[0].keys())
    csvw.writeheader()
    csvw.writerows(results)

顺便说一句,你得到的错误是因为row是一个字符串......你可能会改为item.get()

答案 1 :(得分:0)

我回到了绘图板:

这些是我的发现:

for”语句迭代“results”,每次都会获得一个项目。 名称'row'依次绑定到每个项目。

然后,每次通过“for”循环,我再次重复 results”。名称“index”绑定到每个项目。

然后我尝试使用dict('results'中的每个项目本身就是一个 dict)作为同一个词的关键。 dict不是有效密钥;它不是 “可散类型”,即具有固定值的类型,可以产生a 值的哈希)。

所以我得到了dicts并尝试使用这些dicts作为键入 http://stardict.sourceforge.net/Dictionaries.php下载。这将给出错误“TypeError: unhashable type: 'dict'”.

我不希望原始序列中的项目,但是 来自mapping ::

的键
for input_record in results: 
    output_record = [input_record.get(key, "") for key in input_record] 

但是我随后扔掉了构建的列表,因为我什么也没做 在循环结束之前使用它。

     `writer.writerow(data)` 

此声明仅在 后的所有项目中出现 被迭代了。您将只拥有最新构造的行。

我想要以下内容:

   for input_record in results: 
        output_record = [input_record.get(key, "") for key in input_record] 
        writer.writerow(output_record)