2016-11-08 1 views
0

파이썬에서 N 그램 목록을 작성하려면 아래 코드를 가지고 있습니다. 내가 제대로 파일을 출력하지만 files.txt로 출력을 쓰기에 올 때 작동하지 않습니다 word_grams을 인쇄 할 때 nltk.util 수입에서파일에 출력물을 쓰는 것이 파이썬에서 작동하지 않습니다.

def word_grams(words, min=1, max=6): 
    s = [] 
    for n in range(min, max): 
     for ngram in ngrams(words, n): 
      s.append(' '.join(str(i) for i in ngram)) 
    return s 
email = open("output.txt", "r") 
for line in email.readlines(): 
    with open('file.txt', 'w') as f: 
      for line in email: 
       prnt = word_grams(email.split(' ')) 
       f.write("prnt") 
email.close() 
f.close() 

을 ngrams. "file.txt"는 비어 있습니다.

for line in email.readlines(): 
    with open('file.txt', 'w') as f: 
      for line in email: 
       prnt = word_grams(email.split(' ')) 
       f.write("prnt") 
email.close() 
f.close() 
+0

어떻게 작동하지 않습니까? –

+0

@ juanpa.arrivillaga 코드가 올바르게 실행되면 오류가 발생하지 않고 file.txt는 비어 있습니다. –

+1

"prnt"문자열을 파일에 씁니다. 정말로 원하는 것은'prnt' 변수를 쓰는 것입니다. 단순히 따옴표를 제거하십시오. –

답변

1

1) 최종 f.close() 당신이 루프가 다른 객체)

2 내부 F (원하는 것보다 다른 작업을 수행 :

그래서 나는 문제가 코드의이 라인 내에 있어야합니다 생각) "file.txt"파일의 이름을 지정하고 "files.txt"의 출력을 원한다. 올바른 파일을보고 있습니까?

3) 전자 메일의 각 줄마다 파일을 덮어 쓰고 있습니다. 아마도 "file.txt"에 대한 with 문이 루프 외부에 있어야합니다.

4) 대신이 같은 prnt

뭔가의 "prnt"을 쓰고있다?

def word_grams(words, min=1, max=6): 
    s = [] 
    for n in range(min, max): 
     for ngram in ngrams(words, n): 
      s.append(' '.join(str(i) for i in ngram)) 
    return s 

with open("output.txt", "r") as email: 
    with open('file.txt', 'w') as f: 
     for line in email.readlines(): 
      prnt = word_grams(line.split(' ')) 
      for ngram in prnt: 
       f.write(ngram) 
1

난 당신이 정확히 달성 하려는지 모르겠지만, 당신이 파일을 "경우 output.txt"의 모든 단어에 기능 word_grams을 적용하고 출력을 파일로 저장하려는 것으로 보인다 "file.txt"라고 불리는데, 아마도 한 줄에 하나의 항목 일 것입니다. 이러한 가정으로

,이 방식으로 반복을 재 작성하는 것이 좋습니다 :

words = [] 
# load words from input 
with open("output.txt") as f: 
    for line in f: 
     words += line.strip().split(" ") 
# generate and save output 
grams = apply(word_grams, words) 
with open("file.txt", "w") as f: 
    f.write("\n".join(grams)) 

그러나,이 코드는 함수 word_grams가 제대로 작동한다고 가정합니다. 루프에서

0

귀하의 코드 :

for line in email: 

이 실행되지 않았다!

email.readlines() 실행 후 변수 email이 비어 있기 때문에. 당신은 휴한지 같은 몇 가지 테스트를 수행 할 수 있습니다이 테스트를 실행 한 후

email = open("output.txt", "r") 
for line in email.readlines(): 
    print '1' 
    for line in email: 
     print '2' 

당신이 당신의 경우 output.txt 3 개 라인이있는 경우, 당신은 얻을 것이다 : 출력에

1 
1 
1 

합니다.

그리고이 같은 테스트를 수행 할 수 있습니다

email = open("output.txt", "r") 
email.readlines() 

당신이 당신의 경우 output.txt의 라인 목록을 볼 수 있습니다.

다시 email.readlines()을 실행하면 빈 목록이 표시됩니다.

그래서 문제가 발생합니다. 변수 email은 두 번째 루프에서 비어 있습니다.

관련 문제