从CSV fi导入/导出嵌套字典

2024-06-28 20:35:31 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个CSV文件,数据排列如下:

X,a,1,b,2,c,3
Y,a,1,b,2,c,3,d,4
Z,l,2,m,3

我想创建一个嵌套的CSV字典。在

^{pr2}$

在更新了我编写的程序中的字典(我已经搞定了那个部分),我希望能够将字典导出到相同的CSV文件中,覆盖/更新它。不过,我希望它与以前的CSV文件格式相同,这样我就可以再次导入它了。在

我一直在玩进口货,到目前为止都有这个

import csv
data = {}
with open('userdata.csv', 'r') as f:    
    reader = csv.reader(f)
    for row in reader:
       data[row[0]] = {row[i] for i in range(1, len(row))}

但这不起作用,因为事情安排得不正确。有些数字是其他数字的子键,字母错位等等。我甚至还没到出口部分。有什么想法吗?在


Tags: 文件csv数据inimport程序fordata
3条回答
from collections import defaultdict

data_lines = """X,a,1,b,2,c,3
Y,a,1,b,2,c,3,d,4
Z,l,2,m,3""".splitlines()

data = defaultdict(dict)

for line in data_lines:
# you should probably add guards against invalid data, empty lines etc.
    main_key, sep, tail = line.partition(',')
    items = [item.strip() for item in tail.split(',')]
    items = zip(items[::2], map(int, items[1::2])
    # data[main_key] = {key : value for key, value in items}
    data[main_key] = dict(items)

print dict(data)
# {'Y': {'a': '1', 'c': '3', 'b': '2', 'd': '4'}, 
#  'X': {'a': '1', 'c': '3', 'b': '2'}, 
#  'Z': {'m': '3', 'l': '2'}
# }

既然你对维持秩序不感兴趣,那就简单一点吧:

import csv

# import
data = {}
with open('userdata.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        a = iter(row[1:])
        data[row[0]] = dict(zip(a, a))

# export
with open('userdata_exported.csv', 'w') as f:
    writer = csv.writer(f)
    for key, values in data.items():
        row = [key] + [value for item in values.items() for value in item]
        writer.writerow(row)

后者可以通过只调用csv.writerwriterows()方法并传递给它一个generator expression来实现。在

^{pr2}$

您可以使用来自^{}grouper配方:

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return itertools.izip_longest(fillvalue=fillvalue, *args)

这将把数据分组到所需的a1/b2/c3对中。所以您可以在循环中执行data[row[0]] = {k: v for k, v in grouper(row[1:], 2)}。在

相关问题 更多 >