【问题标题】:Error in exporting list of dictionaries to csv将字典列表导出到 csv 时出错
【发布时间】:2019-10-18 09:48:17
【问题描述】:

我正在尝试将字典列表导出到 excel,这样 csv 文件中的每个变量都有一列,其中包含所有键的对应值。

我尝试导出一个字典字典,以及一个带有字典的列表列表,但它们似乎都不起作用。我该怎么办?

url_test = 'http://app.parlamento.pt/webutils/docs/doc.txt?path=6148523063446f764c324679626d56304c3239775a57356b595852684c3052685a47397a51574a6c636e5276637939535a576470633352764a544977516d6c765a334c446f575a705932387657456c4a535355794d45786c5a326c7a6247463064584a684c314a6c5a326c7a644739436157396e636d466d61574e7657456c4a53563971633239754c6e523464413d3d&fich=RegistoBiograficoXIII_json.txt&Inline=true'

r_test = requests.get(url_test)

mps = cont['RegistoBiografico']['RegistoBiograficoList']['pt_ar_wsgode_objectos_DadosRegistoBiograficoWeb']

result = {}

for j in mps:
     ID = j['cadId']
     Nome = j['cadNomeCompleto']
     Sexo = j['cadSexo']
     resultf = {'ID':ID, 'Nome':Nome, 'Sexo':Sexo}
     result.append(resultf)

with open('bio_json.csv', 'w') as outfile:
    writer = DictWriter(outfile, ('ID', 'Nome', 'Sexo', 'Profissao', 'Legislatura'))
    writer.writerows(result)

我希望得到如上所述的最终 csv。但是,在writer.writerows(result) 之后,我收到了这条消息:

File "C:\Users\fnac\Desktop\Universidade do Minho\Software\lib\csv.py", line 158, in writerows
    return self.writer.writerows(map(self._dict_to_list, rowdicts))
  File "C:\Users\fnac\Desktop\Universidade do Minho\Software\lib\csv.py", line 148, in _dict_to_list
    wrong_fields = rowdict.keys() - self.fieldnames
AttributeError: 'list' object has no attribute 'keys'

【问题讨论】:

  • 您的代码,如所列,即使在该行之前也无法工作 - result 被声明为 dict ({}),而不是列表,并且您正在尝试使用 list 方法.append() 就可以了。
  • (更不用说cont未定义等)
  • 嗨。是的,我以非常草率的方式复制了我已经编写的代码。很高兴你明白我的意思!

标签: python list csv dictionary web-scraping


【解决方案1】:

dicts 列表可以正常工作:

import requests
import csv

resp = requests.get(
    "http://app.parlamento.pt/webutils/docs/doc.txt?path=6148523063446f764c324679626d56304c3239775a57356b595852684c3052685a47397a51574a6c636e5276637939535a576470633352764a544977516d6c765a334c446f575a705932387657456c4a535355794d45786c5a326c7a6247463064584a684c314a6c5a326c7a644739436157396e636d466d61574e7657456c4a53563971633239754c6e523464413d3d&fich=RegistoBiograficoXIII_json.txt&Inline=true"
)
resp.raise_for_status()
data = resp.json()

mps = data["RegistoBiografico"]["RegistoBiograficoList"]["pt_ar_wsgode_objectos_DadosRegistoBiograficoWeb"]

result = [
    {
        "ID": j["cadId"],
        "Nome": j["cadNomeCompleto"],
        "Sexo": j["cadSexo"],
    }
    for j in mps
]

with open("bio_json.csv", "w") as outfile:
    writer = csv.DictWriter(
        outfile,
        ("ID", "Nome", "Sexo", "Profissao", "Legislatura"),
    )
    writer.writerows(result)

bio_json.csv 看起来像

2167,ABEL LIMA BAPTISTA,M,,
3,ADÃO JOSÉ FONSECA SILVA,M,,
462,ALBERTO DE SOUSA MARTINS,M,,
...

【讨论】:

  • 这很有帮助。谢谢!但是,如果我想遍历所有 JSON(我创建了一个包含大约 30 个 JSON 的列表),我需要 for 循环中的结果列表,对吧?
  • 所以发出大约 20 个请求等,最后得到一个 CSV?我将在此处将创建 result 数组的位包装在一个接受原始 url 的函数中,然后为每个 URL 调用它......如果你愿意,我可以增加我的答案。
【解决方案2】:

您可以很容易地从字典列表中创建一个数据框并写入文件(AKX 在他的解决方案中的列表理解方面做得很好)。

import requests
import pandas as pd

resp = requests.get(
    "http://app.parlamento.pt/webutils/docs/doc.txt?path=6148523063446f764c324679626d56304c3239775a57356b595852684c3052685a47397a51574a6c636e5276637939535a576470633352764a544977516d6c765a334c446f575a705932387657456c4a535355794d45786c5a326c7a6247463064584a684c314a6c5a326c7a644739436157396e636d466d61574e7657456c4a53563971633239754c6e523464413d3d&fich=RegistoBiograficoXIII_json.txt&Inline=true"
)
resp.raise_for_status()
data = resp.json()

mps = data["RegistoBiografico"]["RegistoBiograficoList"]["pt_ar_wsgode_objectos_DadosRegistoBiograficoWeb"]

result = [
    {
        "ID": j["cadId"],
        "Nome": j["cadNomeCompleto"],
        "Sexo": j["cadSexo"],
        "Profissao": "", 
        "Legislatura": ""
    }
    for j in mps
]

df = pd.DataFrame(result)
df.to_csv('bio_json.csv')

或者只写一行:

pd.DataFrame(result).to_csv('bio_json.csv')

【讨论】:

  • 嗨。谢谢您的帮助。我以前听说过那个包,但不知道如何使用它。为什么某些名称没有按预期出现在输出文件中?例如,1,3,ADÃO JOSÉ FONSECA SILVA,M 代替 1,3,ADÃO JOSÉ FONSECA SILVA,M
猜你喜欢
  • 2016-09-10
  • 2017-02-11
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 2019-11-09
相关资源
最近更新 更多