Python:将Dict写入CSV

时间:2015-07-27 19:35:35

标签: python csv dictionary

我正在尝试对一个非常大的csv文件运行回归。但是,许多列构造为表示二进制情况,并且只有1个值记录在csv中。应该为0的值列为“'(空)

有没有办法可以解析CSV文件中的所有值,以便''值被记录为0?

Ex:我想转换一下:

One,Two,Three,Four
1,,,1
,,1,        
1,,1,
,,,1

这样的事情:

One,Two,Three,Four
1,0,0,1
0,0,1,0     
1,0,1,0
0,0,0,1

这是我到目前为止的代码。我使用DictReader来修复我需要更新的值。但是,我完全停留在如何将更新后的dict恢复为'固定'csv文件。到目前为止,我尝试过的所有东西都破了。

import csv
import pandas

with open('TestCSV.csv','r') as infile,open('Fixed.csv','w') as outfile:
 r = csv.DictReader(infile)
 w = csv.DictWriter(outfile)
 for row in r:
   for val in row:
      if len(row[val])<1:
         row[val]='0'
   #w.write_row(row) # Produces TypeError

3 个答案:

答案 0 :(得分:3)

for row in r:
   for val in row:
      if len(row[val])<1:
         row[val]='0'
   w.write_row(row)

你必须实际告诉它写行

答案 1 :(得分:1)

如果你真的想使用csv模块,你需要修复的代码中有多个错误,你需要将fieldnames传递给csv.DictWriter然后写下它们和空字符串的长度将是1,因此csv.DictWriter永远不会为真,所以不会有任何改变:

with open('in.csv', 'r') as infile, open('Fixed.csv', 'w') as outfile:
    r = csv.DictReader(infile)
    w = csv.DictWriter(outfile, fieldnames=r.fieldnames)
    w.writeheader()
    for row in r:
        for k, v in row.items():
            if v == "''":
                row[k] = "0"
        w.writerow(row)

要更改原始文件,实际上只需使用str.replace并在没有csv模块的情况下打开文件,就可以更改原始文件,fileinput可以使用inplace=True:< / p>

import fileinput
import sys

for line in fileinput.input("in.csv",inplace=True):
    sys.stdout.write(line.replace("''","0"))

输出:

One,Two,Three,Four
1,0,0,1
0,0,1,0
1,0,1,0
0,0,0,1

或者使用带有NamedTemporaryFileshutil.move,写入tempfile,使用move替换原始文件和更新的文件:

from tempfile import NamedTemporaryFile
来自shutil import move的

with open('TestCSV.csv', 'r') as infile, NamedTemporaryFile(dir=".", delete=False) as  outfile:
    for line in infile:
        outfile.write(line.replace("''", "0"))

move(outfile.name,'TestCSV.csv')

或者,如果您想要新文件,请使用file.write

执行相同操作
with open('TestCSV.csv','r') as infile,open('Fixed.csv','w') as outfile:
     for line in infile:
         outfile.write(line.replace("''","0"))

每行只有一个空字符串或“1”,因此更换空字符串更简单。

如果您打算使用数据实际创建df,则可以使用pandas使用数据框和df.replace轻松完成此操作:

df = pd.read_csv("in.csv")
df.replace("''","0",inplace=True)
print(df)

  One Two Three Four
0   1   0     0    1
1   0   0     1    0
2   1   0     1    0
3   0   0     0    1
# work on df
.......
# save results to csv
df.to_csv("fixed.csv",index=False)

输出:

One,Two,Three,Four
1,0,0,1
0,0,1,0
1,0,1,0
0,0,0,1

答案 2 :(得分:0)

您可以替换值:

df = pd.read_csv('.../temp.csv')

# Replace quotes
[df.replace(x, 0, inplace=True) for x in ['""', "''"]]

# Replace NAs
df.fillna(0, inplace=True)

# Save to csv
df.to_csv('.../Fixed.csv')