2017-04-04 64 views
1

我正在閱讀製表符分隔的文件,其中'n'沒有。字段並對每行進行一些計算並將其打印到控制檯。我面臨的問題是某些行中的某些屬性沒有值並且有空字符串。我想識別這樣的空字符串,並用零替換它們。這裏是我的代碼和示例輸入如下。檢查空格並用零代替

代碼: -

from datetime import datetime 
import csv 
with open('input1.txt') as inputfile: 
    reader = csv.reader(inputfile,delimiter='\t') 
    inputm = list(reader) #contents of csv 

for i in inputm[1:]: 
    print('\n',str(datetime.strptime(i[0].split(':')[1], '%Y%m%d'))[:10] ,i[1],sum(map(float,i[2:6]))/4,i[6]) 

輸入: -

1:20150501 123 10 20 0 0 'xyz' 
2:20150501 124 0 20.6 90 18.7 'abc' 
3:20150501:replacement 123 10.9 20.3 0 80 'def' 
4:20150501 134 10 20 50.6 0 'ghi' 
5:20150501 126 10.7 26.8 0 0 'jkl' 
6:20150501 123 8.9 20 0 'mno' 

評論: - 6排在第5場的空間。這些領域需要被識別並替換爲零。

+0

我想檢查其空字符串或不映射數據浮動之前...它的存在在我的print語句... – Teja

+0

是什麼原因導致你做檢查? – Goyo

回答

0

難道你不能只使用循環和條件?

for idx, val in enumerate(i) 
    if i[idx].isspace(): 
    i[idx] = 0 

這會去你的「線」內循環

for i in inputm[1:]: 
    for idx, val in enumerate(i) 
    if i[idx].isspace(): 
     i[idx] = 0 
    print('\n',str(datetime.strptime(i[0].split(':')[1], '%Y%m%d'))[:10] ,i[1],sum(map(float,i[2:6]))/4,i[6]) 
+0

可以更具體... – Teja

+0

編輯我的答案 –

2

您可以用列表解析,可以讓你做的if/else條件下做到這一點。作爲測試

>>> i = ['11', '', '3.3', ''] 
>>> sum(float(v) if v else 0.0 for v in i) 
14.3 

付諸你的代碼中得到

from datetime import datetime 
import csv 
with open('input1.txt') as inputfile: 
    reader = csv.reader(inputfile,delimiter='\t') 
    inputm = list(reader) #contents of csv 

for i in inputm[1:]: 
    print('\n', str(datetime.strptime(i[0].split(':')[1], '%Y%m%d'))[:10], 
     i[1], sum(float(v) if v else 0.0 for v in i[2:6])/4,i[6]) 

更新

可能很難呈現的例子有標籤,因爲計算器過濾出來。一種技術是編寫一些將字節寫入測試文件的代碼,以便其他人可以運行該代碼。下面是一個工作示例,顯示csv模塊如何識別最後一行中有一個空的製表符分隔的單元格,並將其替換爲空字符串。轉換工作!

# write a test file we can work with 
open('mytest.csv', 'wb').write(
b"""1:20150501\t123\t10\t20\t0\t0\t'xyz' 
2:20150501\t124\t0\t20.6\t90\t18.7\t'abc' 
3:20150501:replacement\t123\t10.9\t20.3\t0\t80\t'def' 
4:20150501\t134\t10\t20\t50.6\t0\t'ghi' 
5:20150501\t126\t10.7\t26.8\t0\t0\t'jkl' 
6:20150501\t123\t8.9\t20\t0\t\t'mno'""") 

import csv 

with open('mytest.csv', newline='') as fp: 
    reader = csv.reader(fp, delimiter='\t', skipinitialspace=True) 
    for row in reader: 
     converted = [float(v) if v else 0.0 for v in row[1:5]] 
     print(row, converted) 

輸出:

['1:20150501', '123', '10', '20', '0', '0', "'xyz'"] [123.0, 10.0, 20.0, 0.0] 
['2:20150501', '124', '0', '20.6', '90', '18.7', "'abc'"] [124.0, 0.0, 20.6, 90.0] 
['3:20150501:replacement', '123', '10.9', '20.3', '0', '80', "'def'"] [123.0, 10.9, 20.3, 0.0] 
['4:20150501', '134', '10', '20', '50.6', '0', "'ghi'"] [134.0, 10.0, 20.0, 50.6] 
['5:20150501', '126', '10.7', '26.8', '0', '0', "'jkl'"] [126.0, 10.7, 26.8, 0.0] 
['6:20150501', '123', '8.9', '20', '0', '', "'mno'"] [123.0, 8.9, 20.0, 0.0] 
+0

這是有道理的。但是,在你的第一個例子中,'i'值是否真的會看到像這樣的空元素?我認爲它會看到一個空格,然後轉到該行中的下一個元素。例如(從索引2開始),第6行會看到'i = ['8.9','20''0','mno']',而不是'i = ['8.9','20','0 '','','mno']' –

+1

@TMartin Stackoverflow的代碼塊將標籤移除至其難以看到的位置,但是如果它是正確實施的製表符分隔文件,則該行將讀爲'['8.9','20 ','0','','mno']'。我會製作一個例子並將其添加到此處。 – tdelaney

+0

@TMartin - 我已更新以顯示'csv.reader'在該行中添加一個空字符串佔位符。 – tdelaney