使用python编写csv文件时缺少值

使用python编写csv文件时缺少值,python,csv,dictionary,Python,Csv,Dictionary,我正在尝试使用python从字典中编写一个csv文件,如下所示: 1: [(3456,12),(4521,78)] 2: [(5478,45),(5609,43)] 3: [(8756,34),(6721,90)] 等等 我有几本这样的字典。他们可以有30把钥匙。为了在csv文件中编写所有词汇表,我编写了以下代码,这些代码将应用于每个词汇表: for i,j in dictionnary.iteritems(): for k in j: cr=csv.reader(open('

我正在尝试使用python从字典中编写一个csv文件,如下所示:

1: [(3456,12),(4521,78)]
2: [(5478,45),(5609,43)]
3: [(8756,34),(6721,90)]
等等

我有几本这样的字典。他们可以有30把钥匙。为了在csv文件中编写所有词汇表,我编写了以下代码,这些代码将应用于每个词汇表:

for i,j in dictionnary.iteritems():
   for k in j:
     cr=csv.reader(open('/home/file.csv','rb'))
     datalist=list(cr)
     c=writerows(datalist+[[self.user_id, i,k[0],k[1]])
当我打开csv文件时,只写入字典的一部分。当我多次运行代码时,字典中的条目不会丢失。
我不明白发生了什么。问题从何而来

每次写入文件时,您都在读取该文件。这意味着,您将读取数据两次。正如其他人建议的那样,将
csv.reader(open(…)
部分从循环中去掉。另外,我认为您正在尝试在CSV的末尾追加数据。如果这是您想要的,请尝试在
ab
(追加二进制)模式下使用
with
命令:


也许这段代码会让您了解如何管理完成CSV文件:

import csv
d1 = {1: [(3456,12),(4521,78)],
      2: [(5478,45),(5609,43)],
      3: [(8756,34),(6721,90)] }

d2 = {1: [(34,1),(4,7)],
      2: [(58,5),(56,4)],
      3: [(87,3),(67,9)] }

d3 = {1: [(111,22),(333,44)],
      3: [(1000,300),(2000,400)] }

d4 = {'AAA': [('arrze','iifuiyu')],
      'BBB': [(575757,'434343434')] }

def yi(input):
    for user_id,d in input:
        for i in d:
            for tu in d[i]:
                    yield [user_id, i, tu[0], tu[1]]

def csvcompl(fn,ds):           
    with open(fn,'ab') as cc:
        cr = csv.writer(cc)
        cr.writerows(yi(ds))

ds = (('Lavillenie',d1),('Abba',d2),(987654321,d3))
csvcompl('fifiroro.csv',ds)
csvcompl('fifiroro.csv',(('OPO',d4),))

with open('fifiroro.csv','r') as f:
    print f.read()
结果

Lavillenie,1,3456,12
Lavillenie,1,4521,78
Lavillenie,2,5478,45
Lavillenie,2,5609,43
Lavillenie,3,8756,34
Lavillenie,3,6721,90
Abba,1,34,1
Abba,1,4,7
Abba,2,58,5
Abba,2,56,4
Abba,3,87,3
Abba,3,67,9
987654321,1,111,22
987654321,1,333,44
987654321,3,1000,300
987654321,3,2000,400
OPO,AAA,arrze,iifuiyu
OPO,BBB,575757,434343434

试试这个:我以为我理解你的问题,但我不理解。显然,我们缺少了您代码的一个重要部分。我不明白为什么每次迭代都要读取相同的csv文件,以及
writerows
函数的功能。它不能是
csv.writer.writerows
,因为它没有附加到任何对象。另请参阅有关如何使用编写器的说明。我认为他们正在尝试将数据附加到CSV的末尾。这将解释为什么OP需要在每次迭代时刷新
数据列表
,因为如果我在迭代前创建csv.writer,我会说该文件未打开。writerows函数将my dictionnary的内容添加到csv文件中已写入内容的末尾。奇怪的是,代码是有效的,但我的词汇表中只有几项缺失。它们在每次运行时都不一样,我得到以下消息:'expecting for a character buffer object'我修正了一些事情。我正在使用一个
csvwriter
并在
ab
中打开文件,该文件以二进制形式追加。检查编辑。它起作用了吗?如果有,你介意接受答案吗?谢谢
Lavillenie,1,3456,12
Lavillenie,1,4521,78
Lavillenie,2,5478,45
Lavillenie,2,5609,43
Lavillenie,3,8756,34
Lavillenie,3,6721,90
Abba,1,34,1
Abba,1,4,7
Abba,2,58,5
Abba,2,56,4
Abba,3,87,3
Abba,3,67,9
987654321,1,111,22
987654321,1,333,44
987654321,3,1000,300
987654321,3,2000,400
OPO,AAA,arrze,iifuiyu
OPO,BBB,575757,434343434