2010-05-19 116 views
1

因此,我正在處理缺少值的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 

下面是數據的一個例子,我想它,最好應該在任一列lenghth

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 

^h不過,它似乎只出了一條記錄,我會將命令行中的輸出傳輸到一個新文件。更新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) 
+0

您只打印一行的原因是您的打印語句超出了for循環 - 縮進一次,您應該沒問題。 – Personman 2010-05-19 04:25:43

+0

您可以將「if len(x)<1:」替換爲「if x.strip():」。 「」將評估爲False,並且任何字符串值都會變爲True(包括空格)。 – monkut 2010-05-19 04:52:06

+0

在更新中,您刪除了循環內的'print'語句,您真的想要刪除循環外部的語句。根據我的回答,你可能也希望去掉你的字符串。 – Johnsyweb 2010-05-19 12:28:41

回答

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,你必須明確地做到這一點。

1

你幾乎在那裏

只有幾個小錯誤。

  • len(x)< 1不會爲數據的第二行中的第二列工作,因爲x將包含' '(和具有的長度> 1)。你需要strip你的字符串。

  • print row可能會打印一個空列表,因爲您已完成迭代。你大概可以刪除這一行。

另外:你是否試圖修改文件或只是輸出更正到管道到其他文件或過程?