在文件上写输出不能在python中工作

时间:2016-11-08 09:01:35

标签: python

我有以下代码在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()

3 个答案:

答案 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在你的第二个循环中是空的。