Python: написать словарь с несколькими строками в CSV - PullRequest
0 голосов
/ 06 мая 2018

У меня есть словарь с несколькими строками из моего вопроса ранее. Генерируется с помощью:

import requests
from bs4 import BeautifulSoup
import re
import csv

links = ["34519-kevitsa-copper-concentrator-plant", "34520-kevitsa-copper-mine", "34356-glogow-copper-refinery"]

for l in links:

    page = requests.get("https://www.industryabout.com/country-territories-3/2199-finland/copper-mining/"+l)
    soup = BeautifulSoup(page.content, 'lxml')
    rows = soup.select("strong")
    d = {}

    for r in rows:
        name, value, *rest = r.text.split(":")
        if not rest:
            d[name] = value
    print(d)

print(d.items()) дает:

dict_items ([(«Товары», «Медь, никель, золото»), («Площадь», «Лаппи»), («Тип», «Завод по обогащению меди»)])

dict_items ([(«Товары», «Медь, никель, золото»), («Площадь», «Лаппи»), («Тип», «Шахта»)])

dict_items ([(«Товары», «Медь»), («Район», «Долнослаские»), («Тип», «Медный завод»)])

Но когда я пишу это в CSV с любым из решений из " Запись словаря в файл CSV с одной строкой для каждого 'ключ: значение' ", я получаю только последний элемент словаря, другие опущены.

Commodities;Copper
Area;Dolnoslaskie
Type;Copper Refinery

Как я могу написать CSV с выглядит так:

Commodities;Area;Type
Copper, Nickel, Gold;Lappi;Copper Concentrator Plant
Copper, Nickel, Gold;Lappi;Open-pit mine
Copper;Dolnoslaskie;Copper Refinery

Я также пытался перейти на массив, но не смог найти решение для array[name] = value.

Этот ответ кажется идеальным, но iterkeys только для Python 2.

with open('my_data.csv', 'wb') as ofile:
    writer = csv.writer(ofile, delimiter='\t')
    writer.writerow(['ID', 'dict1', 'dict2', 'dict3'])
    for key in ddict.iterkeys():
        writer.writerow([key] + [d[key] for d in dicts])

Ответы [ 2 ]

0 голосов
/ 06 мая 2018
import csv

with open('data.csv', 'w') as outfile:
    writer = csv.DictWriter(outfile, ['Commodities', 'Area', 'Type'], delimiter=';')
    writer.writeheader()
    for l in links:
        ...
        print(d)
        writer.writerow(d)
0 голосов
/ 06 мая 2018

Вы можете попробовать это.

#!python
# -*- coding: utf-8 -*-#

d = {k:v for (k,v) in zip(list('abc'),range(3))}
print(d)

with open('a.txt','w') as fo:
    for i in d:
        line = '{};{}\n'.format(i,d[i])
        fo.write(line)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...