2013-06-02 1 views
1

파일 이름을 문자열로 사용하고 파일을 열고 읽은 다음 "XXXX"로 파일의 각 4 자 단어를 변경하는 새 파일을 작성하는 함수를 작성하려고합니다.대체 된 출력으로 파일을 변경하는 방법은 무엇입니까?

지금까지 내가 가진 :

def change(filename): 
    infile = open(filename,'r') 
    outfile = open('changed.txt', 'w') 
    l = infile.read() 
    infile.close() 
    x = l.split() 

    for word in x: 
     if len(word) == 4: 
      outfile.replace(word,'XXX') 

내가 내 if 문에서 출력을 망치는거야라고 생각하지만, 나는이 문제를 해결하는 방법을 모르겠어요. 내가 가진 (내가 'example.txt'라고했다) 내 파일에서

가 내 출력 파일에

"이 파일 3 ~ 4 글자 단어를 포함" "changed.txt"나는 얻어야한다 "XXXX XXXX를 세 개의 XXXX 문자가 포함되어 있습니다. "

+2

읽어 내기 전에'infile()'을 닫아서는 안됩니다. –

+2

'infile'과'outfile'은 파일 객체입니다; 하나를 읽고 다른 하나에 데이터를 써야합니다. '.replace()'와'.split()'은 문자열 메소드이므로 파일에는 사용할 수 없습니다. –

+0

@TimPietzcker 파일을 닫기 전에 l = infile.read()를 추가하여 편집했습니다. 이 올바른지? – M15671

답변

0

한 가지 제안을 내다입니다 :

import re 
def change(filename): 
    with open(filename) as infile, open("changed.txt", "w") as outfile: 
     text = infile.read() 
     outfile.write(re.sub(r"\b\w{4}\b", "XXXX", text)) 

이 (단순화로) 가정합니다 "단어"그 순서입니다 영숫자가 아닌 문자로 둘러싸인 네 개의 영숫자 문자. 충분히 구체적이지 않은 경우 (2001과 일치하고 böse과 일치하지 않으며 they'reXXXX're으로 변경) 알려주세요.

주된 작업은 "word boundary와 일치하고 그 다음 4 개의 영숫자와 단어 경계"를 의미하는 정규식 \b\w{4}\b에 의해 수행됩니다.

0
import re 
re.sub('([^\w]|^)\w{4}(?=[^\w]|$)', r'\1XXXX', input) 

트릭을해야합니다.

편집이 : 바로 분리 당신이 뭘 하려는지 달성하는 방법

+0

두 개의 4 문자 단어가 서로 이어지는 경우 실패합니다. –

+0

당신이 옳습니다. – sleeplessnerd

+0

왜 '\ b' 단어 경계를 사용하지 않습니까? 그들은이 기능을 정확히 구현합니다. –

관련 문제