【问题标题】:Replacing empty csv column values with a zero用零替换空的csv列值
【发布时间】:2011-02-21 04:57:04
【问题描述】:

所以我正在处理一个缺少值的 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)

【问题讨论】:

  • 你只打印一行的原因是你的打印语句在for循环之外——缩进一次,你应该没问题。
  • 您可以将“if len(x)
  • 在您的更新中,您删除了循环内的 print 语句,而您确实想删除循环外的语句。根据我在下面的回答,您可能还希望剥离您的字符串。

标签: python csv list


【解决方案1】:

非常快到了!

只有几个小错误。

  • len(x)&lt; 1 不适用于数据第二行的第二列,因为x 将包含' '(并且长度> 1)。你需要strip你的字符串。

  • print row 可能会打印一个空列表,因为您已经完成了迭代。您可能可以删除此行。

另外:您是在尝试修改文件还是只是将更正输出到管道到其他文件或进程?

【讨论】:

    【解决方案2】:

    更改您的代码:

    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 的空值之外,所有其他值都将保留为字符串。如果你想把它们变成ints,你必须明确地这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2014-02-26
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      相关资源
      最近更新 更多