【问题标题】:Python: Write dictionary with multiple rows to CSVPython:将多行字典写入 CSV
【发布时间】: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


【解决方案1】:
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)

【讨论】:

    【解决方案2】:

    你可以试试这个。

    #!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)
    

    【讨论】:

    • 这不是写CSV,它只是告诉他如何写一些完全不同的格式。
    • 你的字典是什么?你能提供文本文件和你的字典吗?
    • 你可以再试一次吗?
    猜你喜欢
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2018-06-17
    • 2012-11-04
    • 2014-08-01
    • 2018-03-19
    • 2016-03-01
    • 2015-06-06
    相关资源
    最近更新 更多