Ошибка при экспорте списка словарей в csv - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь экспортировать список словарей в 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'

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Вы можете легко создать фрейм данных из списка словарей и записать его в файл (отличная работа 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')
0 голосов
/ 18 октября 2019

Список диктовок работает нормально:

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,,
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...