用零替换空CSV列值
我正在处理一个有缺失值的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
(整数),你得明确地去做这件事。