2014-10-30 104 views
0

我對Python很新。說我有一個(非常大)分隔文本這樣的文件中的數據:Python找到並用NA代替分隔文本文件

a|b|c|d|e 

1|.|.|-|. 

1.2|2.6|||1.7 

由於文本文件是真的很大,我想讀它一行行寫。我想要替換.-或空的字符串,NA。這是我的嘗試:

import csv 

f = open('sample1_fixed.txt','wb') 

targets1, new1 = ['|.|','|-|','||','| |'], '|NA|' 

for line in open('sample1.txt', 'rb'): 
    for target in targets1: 
     if target in line: 
      line = line.replace(target,new1) 
    for target in targets1: 
     if target in line: 
      line = line.replace(target,new1) 
    f.write(line + "\n") 
f.close() 

但我在想一定有更好的方法,使用分隔符?此解決方案也不會在行結束和開始處拾取實例。有更好的程序員的想法嗎?

預期輸出:

A | B | C | d |電子

1 | NA | NA | NA | NA

1.2 | 2.6 | NA | NA | 1.7

import csv 
import re 

f=open('sample1_fixed.txt','wb') 

with open('sample1.txt','rb') as inputfile: 
    read=csv.reader(inputfile, delimiter='|') 
    for row in read: 
     text = row[1] 
     text = re.sub(r'^\.$','NA',text) 
     text = re.sub(r'^-$','NA',text) 
     f.write(text + '\n') 
f.close() 

我也使用CSV模塊和正則表達式的嘗試

但這隻允許我一次寫一列,我不知道如何讓它們全部輸出...

+0

上述輸入的預期輸出是什麼? – 2014-10-30 00:43:47

+2

你看過內置的csv模塊嗎?您可以指定一個自定義分隔符。 – marklap 2014-10-30 00:53:05

+0

一種方法是使用帶有自定義分隔符='|'的csv.reader以及用於replace_NAs()的輔助函數。我只是注意到你想要NA替換。 – smci 2014-10-30 02:03:37

回答

2

使用帶有自定義分隔符='|'的csv.reader和輔助函數功能爲replace_NAs:

import csv 

delim = '|' 

def replace_NAs(row, NA_values=["", ".", "-"]): 
    if x in NA_values: 
     return "NA" 
    else: 
     return x 

with open('infile') as csvfile: 
    reader = csv.reader(csvfile, delimiter=delim) 
    for row in reader: 
     transformed_row = [replace_NAs(x) for x in row] 
     print delim.join(transformed_row) 

a|b|c|d|e 
1|NA|NA|NA|NA 
1.2|2.6|NA|NA|1.7 
+0

爲什麼它不能打印第二個「NA」? – 2014-10-30 01:07:08

+0

@AvinashRaj:我只注意到OP也希望在所有領域都進行NA替換。完成。爲了清晰起見編輯標題。 – smci 2014-10-30 02:05:42

+0

+1。我認爲這是更好的答案。 – nhahtdh 2014-10-30 03:02:38

相關問題