【问题标题】:Python: Writing a Dict to CSVPython:将字典写入 CSV
【发布时间】:2015-07-27 19:35:34
【问题描述】:

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

有没有一种方法可以解析 CSV 文件中的所有值,以便将 '' 值记录为 0?

例如:我想转换这个:

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

【问题讨论】:

  • 最后你真的要创建一个数据框吗?

标签: python csv dictionary


【解决方案1】:
for row in r:
   for val in row:
      if len(row[val])<1:
         row[val]='0'
   w.write_row(row)

你必须实际告诉它写行

【讨论】:

  • 我试过了。我不断收到一条错误消息。TypeErrror:__init__() 至少需要 3 个参数(给定 2 个)
【解决方案2】:

如果您真的想使用 csv 模块,您的代码中有多个错误需要修复,您需要将fieldnames 传递给csv.DictWriter 然后写入它们,空字符串的长度将为@987654328 @ 所以csv.DictWriter 永远不会是 True 所以什么都不会改变:

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 模块的文件,要更改原始文件,您可以使用 fileinputinplace=True

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,写入临时文件,使用 move 将原始文件替换为更新的文件:

from tempfile import NamedTemporaryFile

从shutil导入移动

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 使用 Dataframe 和 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

【讨论】:

  • 我尝试了您的解决方案的 pandas 版本,但在 df.replace("''",'0',inplace=True) 处遇到语法错误。
  • 那你肯定打错了。
  • 我一直在使用两台计算机。我的 mac 用于堆栈溢出,ASUS 用于我的工作。我不允许通过电子邮件传输客户信息,所以我一直在手动输入所有内容。截至发表评论时,我已将 100% 转移到我的电脑上。
  • ....... 只是意味着你必须做的任何工作,它实际上并不是代码
【解决方案3】:

您可以替换值:

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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-15
    • 2018-06-17
    • 2012-11-04
    • 2018-03-19
    • 2016-03-01
    • 2015-06-06
    • 2018-07-25
    • 2019-02-19
    相关资源
    最近更新 更多