【问题标题】:File still empty after call to f.write()调用 f.write() 后文件仍然为空
【发布时间】:2020-10-18 10:23:25
【问题描述】:

这个程序(用 Python 编写)应该只显示写入到 特定文件。但是,当我运行它时,虽然它没有错误,但它在 IDE 中不显示任何输出 也不是文件本身。

def file_read_from_head(fname, nlines):
    from itertools import islice
    with open(fname) as f:
        for line in islice(f, nlines):
            print(line)


f = open('test.txt', 'w')
f.write = ("Hello welcome to Python \n"
           "THis is the second line \n"
           "This is the third line \n")


print(file_read_from_head('test.txt', 2))

【问题讨论】:

  • = 不应该出现在 f.write = (...) 中。你想打电话给f.write,而不是分配给它。你也应该在写完之后关闭f(在你尝试阅读你写的内容之前)。
  • @khelwood 说了什么。此外,您可能需要在阅读之前关闭文件 (f.close()),因为文本首先写入缓冲区。关闭文件可以保证缓冲区中的所有文本都写入磁盘上的实际文件。

标签: python output


【解决方案1】:

几点说明:

  1. 如 cmets 所示,您应该调用 f.write()不是 将输出分配给名为f.write 的变量
  2. 致电f.write() 后,您还需要关闭该文件。您可以使用f.close() 实现此目的。 但是,使用context manager 是更好的做法(请参阅此答案下方的 cmets)。使用上下文管理器可以更轻松地避免错误(例如忘记关闭文件......)。实际上,您已经在 file_read_from_head() 函数中使用了上下文管理器。
  3. 您的函数file_read_from_head() 调用print(line),因此不需要print(file_read_from_head())(也不需要按照您的意愿行事)
  4. 通常认为在函数导入是不好的做法(参见question for a discussion)。相反,它更喜欢将所有导入语句放在文件顶部。

考虑到以上所有因素,我们可以将您的代码修改为:

from itertools import islice

def file_read_from_head(fname, nlines):
    with open(fname) as f:
        for line in islice(f, nlines):
            print(line)


# Context managers make it easier to avoid forgetting to close files
with open('test.txt', 'w') as f:
    f.write("Hello welcome to Python \n"
            "This is the second line \n"
            "This is the third line \n")


file_read_from_head('test.txt', 2)

【讨论】:

  • 而不是建议 close 文件,你真的应该建议使用 with 代替
  • 像 OP 那样打开和关闭文件并没有什么错误。但我同意,使用上下文管理器要干净得多(我也在答案中暗示了这一点)
  • 打开和关闭文件有一些问题,其中一个问题在上面的问题中提出......我想你在我写评论时编辑的正确。我也想匹配该建议的代码
  • 再说一遍,没错。是的,它更容易出错,而且不那么 Python,我总是提倡使用上下文管理器。但这不是“错误”
  • 是的,我想这个论点可以永远持续下去,因为它取决于你如何定义错误......处理文件的惯用方式和最佳方法是使用@987654334 @。您的答案建议这样做,这是完美的,我也会更改代码示例,并避免在我的答案中使用open/close
【解决方案2】:

你做错了一些事情。首先 f.write 是一个函数而不是变量。所以替换为:

f.write("Hello welcome to Python \n"
       "THis is the second line \n"
       "This is the third line \n")
f.close()

当您在 file_read_from_head 函数中打开文件时,您没有提供读/写标志,因此将其替换为:

with open(fname, 'r') as f:

您还打印了 file_read_from_head 的结果,这将是无,因此您应该删除函数调用周围的 print()。

【讨论】:

  • 您的第二个建议无关紧要,因为打开文件的默认模式是'r',所以在这种情况下open(fname) 非常好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2016-02-19
相关资源
最近更新 更多