用零替换空CSV列值

1 投票
2 回答
10605 浏览
提问于 2025-04-15 22:52

我正在处理一个有缺失值的csv文件。
我希望我的脚本能够做到:

#!/usr/bin/python

import csv
import sys

#1. Place each record of a file in a list.
#2. Iterate thru each element of the list and get its length.
#3. If the length is less than one replace with value x.


reader = csv.reader(open(sys.argv[1], "rb"))
for row in reader:
    for x in row[:]:
                if len(x)< 1:
                         x = 0
                print x
print row

这里有一个我正在尝试的数据示例,理想情况下它应该适用于任何列的长度。

Before:
actnum,col2,col4
xxxxx ,    ,
xxxxx , 845   ,
xxxxx ,    ,545

After
actnum,col2,col4
xxxxx , 0  , 0
xxxxx , 845, 0
xxxxx , 0  ,545

任何指导意见都非常感谢。

更新:这是我现在的代码(谢谢大家):

reader = csv.reader(open(sys.argv[1], "rb"))
for row in reader:
    for i, x in enumerate(row):
                if len(x)< 1:
                         x = row[i] = 0
print row

不过它似乎只输出了一条记录,我会把输出结果通过命令行导入到一个新文件中。

更新3:好的,现在我遇到了相反的问题,我输出了每条记录的重复项。
这是为什么呢?

After
actnum,col2,col4
actnum,col2,col4
xxxxx , 0  , 0
xxxxx , 0  , 0
xxxxx , 845, 0
xxxxx , 845, 0
xxxxx , 0  ,545
xxxxx , 0  ,545

好的,我已经修复了它(见下文),谢谢大家的帮助。

#!/usr/bin/python

import csv
import sys

#1. Place each record of a file in a list.
#2. Iterate thru each element of the list and get its length.
#3. If the length is less than one replace with value x.


reader = csv.reader(open(sys.argv[1], "rb"))
for row in reader:
    for i, x in enumerate(row):
                if len(x)< 1:
                         x = row[i] = 0
    print ','.join(str(x) for x in row)

2 个回答

1

你已经非常接近成功了!

不过还有几个小问题需要修复。

  • len(x)< 1 这个判断在你数据的第二行第二列是行不通的,因为 x 里面会包含 ' '(而且长度大于1)。你需要用 strip 方法去掉字符串两边的空格。

  • print row 可能会打印出一个空列表,因为你已经遍历完所有内容了。你可以考虑直接把这一行删掉。

另外:你是想修改文件,还是只是想把修正的内容输出到其他文件或程序中呢?

4

把你的代码改成这样:

for row in reader:
    for x in row[:]:
                if len(x)< 1:
                         x = 0
                print x

改成:

for row in reader:
    for i, x in enumerate(row):
                if len(x)< 1:
                         x = row[i] = 0
                print x

我不太明白你用print想要达到什么效果,但关键问题是你需要修改row,而为此你需要一个索引,enumerate可以帮你提供这个索引。

另外要注意,除了那些你要改成数字0的空值,其他的值都会保持为字符串。如果你想把它们变成int(整数),你得明确地去做这件事。

撰写回答