【问题标题】:Attempting to write to a file in Python makes the file go blank尝试在 Python 中写入文件会使文件变为空白
【发布时间】:2015-04-17 08:02:23
【问题描述】:

我对 Python 比较陌生,我正在尝试在 Python 中创建一段代码,该代码在文本文件的每一行中查找用户输入的特定值,然后用新的替换一行由代码创建的。但是,当我尝试代码时,文件变为空白。我有一个f.close(),但代码仍然不会写。

这是我的代码:

import fileinput

f = open("task3.txt", "w+")

name = input("What is your name?")

lines = f.readlines()
print(lines)

for i in lines:
    splitlines = i.split(":")
    print(splitlines)
    splitnums = splitlines[1].split(", ")
    print(splitnums)
    for i in splitnums:
        i = int(i)
    edit = input('Would you like to edit this entry?')
    if edit == "Yes":
        valueNew = input("Which new value would you like to add?")
        del(splitnums[2])
        splitnums.append(splitnums[1] + "\n")
        splitnums[1] = splitnums[0] + ", "
        splitnums[0] = valueNew + ", "
        print(splitnums)
        numstring = ''.join(splitnums)
        splitlines[1] = ": "
        splitlines.append(numstring)
        newval = ''.join(splitlines)
        print(newval)
        f.write(newval)
    else:
        print("Okay.")

f.close()

【问题讨论】:

  • 你需要以追加模式打开文件f = open("task3.txt", "r+")我不确定w+是一个有效的模式
  • From open() w+ 截断文件,这意味着它会在读取或写入之前清空内容。
  • @EdChum:这完全正确,这与他所看到的完全一样:打开文件进行读写,先创建或截断它。
  • @abarnert 我不确定,因为我之前没有见过那个组合,docs 中也没有提到它,这就是我质疑它的原因,很高兴知道语义差异,谢谢
  • @EdChum:本教程通常只提到广泛有用的东西(尽管它确实有一些奇怪的切线......);要获取完整的详细信息,请查看 open 方法的库参考文档 (3.x/2.x)。 (在 2.x 中,在某些情况下,文档会选择“无论您的操作系统的 C 库做什么”;在 3.x 中,它们已针对所有操作系统完全指定。但这是因为在 CPython 2.x 中,open 只使用C 库,在 3.x 和其他 2.x 实现中,它都是手动完成的。)

标签: python file input


【解决方案1】:

您必须阅读整个文件,然后在再次写入之前更改内容,因为w 会清除文件内容。如果追加(添加到末尾)文件就足够了,您可以将mode 参数更改为a 以以追加模式打开文件。

您还应该考虑使用with 而不是手动关闭文件:

with open('file.txt', 'w') as f:
    ...

,因为这会关闭文件并清理而不考虑抛出错误等。

【讨论】:

  • 你可能不想要a。这会在末尾开始文件指针,这对于读取不是很有用,并且取决于平台,它可能会或可能不会在每次写入后将文件指针跳回末尾。
【解决方案2】:

模式w+的意思是“打开文件写,先截断,再让我读”

所以,它完全按照你的要求做。

如果你想打开文件进行阅读,但也让你写,那就拼写r+。或者,在 Python 3.0+ 中,您也可以只使用普通的 +

open 的文档甚至包括不同模式的示例,可以准确解释您的要求:

默认模式是'r'(打开阅读文本,'rt'的同义词)。对于二进制读写访问,模式 'w+b' 打开并将文件截断为 0 字节。 'r+b' 打开文件而不截断。

或者,对于the 2.x version

模式'r+'、'w+'和'a+'打开文件进行更新(读写);请注意,'w+' 会截断文件。

这就是r+w+(或r+bw+b)之间的区别:当您不想截断时,请使用r

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多