[英]Read/Write a dictionary with values as integer lists in a csv file in python 2.6.x
所以我做了很多谷歌搜索,但仍然不能解决这个问题。 我尝试了这个:
import csv
mydict={4442:[4441,4442], 4441:[4441,4442]}
with open('testcsv.csv','wb') as f:
writer = csv.writer(f, delimiter=' ')
for key, value in mydict.items():
writer.writerow([key, value])
但这完全不是我所期望的。 因为它会生成如下的csv文件:
4441 "[4441, 4442]"
4442 "[4441, 4442]"
我永远不会把字典值读成一个列表,而是一个字符串。 我的阅读过程如下:
result={}
try:
reader = csv.reader(open('testcsv.csv', 'rb'))
result = dict(x for x in reader) #note: Everything turned to be string after reading from csv
print "testcsv.csv found, load it from file."
except:
print "testcsv.csv not found. loop all over."
然后我的结果更改为:
print result
print result[str(4442)]
print result[str(4441)]
{'4441': '[4441, 4442]', '4442': '[4441, 4442]'}
[4441, 4442]
[4441, 4442]
所以我的问题是,对于以整数列表作为其值的字典,如何按原样写入/读取?
更新解决方案,下面接受的答案也将起作用:
for row in reader:
if row[1][1:-1] != '':
result[int(row[0])] = map(int, row[1][1:-1].split(','))
else:
result[int(row[0])] = []
在这里,空格不是一个好的分隔符,因为列表的字符串表示形式包含一个空格。 对于我的答案,我使用的是“ |” 作为分隔符。
要加载csv文件,以便它创建一个与您编写的字典相同的字典,可以使用以下代码:
try:
reader = csv.reader(open('bar.in', 'rb'), delimiter='|')
result = dict((int(x[0]), eval(x[1])) for x in reader)
print "testcsv.csv found, load it from file."
except:
print "testcsv.csv not found. loop all over."
所以现在的结果是:
{4441: [4441, 4442], 4442: [4441, 4442]}
所有数字均为整数。 但是请记住,这使用了eval,eval可能很危险。
这有效(并且不使用eval()
)。 请注意,csv文件行的写入方式与您的版本略有不同。
import csv
mydict={4442:[4441,4442], 4441:[4441,4442]}
with open('testcsv.csv', 'wb') as f:
writer = csv.writer(f, delimiter=' ')
for key, value in mydict.items():
writer.writerow([key] + value) # note difference from your version
try:
reader = csv.reader(open('testcsv.csv', 'rb'), delimiter=' ')
result = dict((row[0], row[1:]) for row in (map(int, row) for row in reader))
print "testcsv.csv found, load it from file."
print result
except Exception as e:
print "testcsv.csv not found. loop all over."
print e
输出:
testcsv.csv found, load it from file.
{4441: [4441, 4442], 4442: [4441, 4442]}
注意:单线创建result
等效于:
result = {}
for row in (map(int, row) for row in reader):
result[row[0]] = row[1:]
您需要一个扁平化的列表,例如[a,b,c...]
而不是[a,[...],c,...]
for key, value in mydict.items():
writer.writerow([key]+ value)
将输出(第一行)
4441 4441 4442
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.