【发布时间】:2018-05-05 22:22:06
【问题描述】:
我之前的question 有一本包含多行的字典。 它是通过以下方式生成的:
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([('Commodities', 'Copper, Nickel, Gold'), ('Area', 'Lappi'), ('Type', '铜选矿厂') ])
dict_items([('Commodities', 'Copper, Nickel, Gold'), ('Area', 'Lappi'), ('Type', 'Open-pit Mine') ])
dict_items([('Commodities', 'Copper'), ('Area', 'Dolnoslaskie'), ('Type', 'Copper Refinery') ])
但是当我使用“Writing a dictionary to a csv file with one line for every 'key: value'”中的任何解决方案将其写入 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的解决方案。
This answer 看起来很完美,但 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])
【问题讨论】:
-
您的问题一开始是关于一本字典,然后突然出现了多本。请包含更多代码。
-
这里是完整的代码。
-
“将字典写入 csv 文件,每个 'key: value' 一行”这个问题正是您不想要的。你想写几个字典,每个字典一行。 DictWriter 会做得很好。
-
它只适用于 Python2(见上文)。
-
同样,该答案是针对提问者想要的输出与您想要的相反的问题。他们希望每个 dict 有一列,而您希望每个 dict 有一行。
标签: python csv dictionary