2014-10-30 1 views
0

저는 파이썬을 처음 접했습니다. 나는이 같은 (매우 큰)으로 구분 된 텍스트 파일의 데이터를 가지고 말 : 텍스트 파일이 정말 크기 때문에파이썬은 구분 된 텍스트 파일에 대해 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 | E

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

위의 입력에 대한 예상 출력은 얼마입니까? –

+2

내장 된 csv 모듈을 살펴 보셨습니까? 사용자 정의 구분 기호를 지정할 수 있습니다. – marklap

+0

한 가지 방법은 사용자 지정 구분 기호 = '|'및 replace_NAs()에 대한 도우미 함수를 사용하여 csv.reader를 사용하는 것입니다. NA 교체를 원한다는 것만 알았습니다. – smci

답변

2

csv.reader에 사용자 지정 구분 기호 = '|'를 사용하고 도우미 function for 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'를 인쇄하지 못하는 이유는 무엇입니까? –

+0

@AvinashRaj : 나는 단지 OP가 모든 분야에서 NA 교체를 원한다는 것을 알아 차렸다. 끝난. 명확성을 위해 제목을 편집했습니다. – smci

+0

+1. 나는 이것이 더 나은 대답이라고 생각한다. – nhahtdh

관련 문제