使用Python写入CSV文件时缺失值的处理

0 投票
2 回答
2687 浏览
提问于 2025-04-17 21:28

我正在尝试用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文件时,发现字典只有一部分被写入。每次运行这段代码时,缺失的字典条目也不一样。我不明白这是怎么回事。问题可能出在哪里呢?

2 个回答

0

也许这段代码能给你一些关于如何处理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
0

你每次写入文件的时候都在读取这个文件。这就意味着你读取了两次数据。正如其他人所建议的,把 csv.reader( open(...) ) 这一部分放到循环外面。另外,我觉得你是想把数据 追加 到 CSV 文件的末尾。如果是这样的话,可以试试使用 with 命令,并且以 ab(追加二进制)模式来 打开文件

with open('/home/file.csv','ab') as csvfile:
    csvwriter = csv.writer( csvfile, delimiter=' ', quoting=csv.QUOTE_MINIMAL )
    for i,j in dictionary.iteritems():
        for k in j:
            csvwriter.writerow( [ self.user_id, i, k[0], k[1] ] )

撰写回答