我有以下代码在Python中写出一个N-gram列表。
来自nltk.util import ngrams
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()
当我打印出word_grams
时,它会正确打印出文件,但是当将输出写入files.txt
时,它无法正常工作。 " 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 :(得分:1)
1)最后的f.close()
做的不是你想要的东西(循环中的f是另一个对象)
2)您将文件命名为“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 :(得分:1)
我不知道你想要完成什么,但似乎你想将函数word_grams
应用于文件“output.txt”中的每个单词并将输出保存到文件中称为“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
正常工作。
答案 2 :(得分: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
在你的第二个循环中是空的。