ValueError:必须完全具有创建/读取/写入/附加模式之一

时间:2018-12-24 20:33:55

标签: python

我有一个打开的文件,我想搜索直到在行首找到一个特定的文本短语。然后,我想用“句子”覆盖该行

sentence = "new text"           "
with open(main_path,'rw') as file: # Use file to refer to the file object
    for line in file.readlines():
        if line.startswith('text to replace'):
            file.write(sentence)

我得到:

Traceback (most recent call last):
 File "setup_main.py", line 37, in <module>
with open(main_path,'rw') as file: # Use file to refer to the file object
ValueError: must have exactly one of create/read/write/append mode

我该如何工作?

4 个答案:

答案 0 :(得分:3)

您可以打开一个文件以同时进行读写,但无法按您期望的方式工作:

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

with open('file.txt', 'r+') as f:  # The mode is r+ instead of r
    print(f.read())  # prints "abcd"

    f.seek(0)        # Go back to the beginning of the file
    f.write('xyz')

    f.seek(0)
    print(f.read())  # prints "xyzd", not "xyzabcd"!

您可以覆盖字节或扩展文件,但是如果不重写超出当前位置的所有内容,就无法插入或删除字节。 由于行的长度不尽相同,因此最简单的做法是分两个步骤进行操作:

lines = []

# Parse the file into lines
with open('file.txt', 'r') as f:
    for line in f:
        if line.startswith('text to replace'):
            line = 'new text\n'

        lines.append(line)

# Write them back to the file
with open('file.txt', 'w') as f:
    f.writelines(lines)

    # Or: f.write(''.join(lines))

答案 1 :(得分:1)

您不能读写同一文件。您必须先阅读main_path,然后再写一封信,例如

sentence = "new text"
with open(main_path,'rt') as file: # Use file to refer to the file object
    with open('out.txt','wt') as outfile:
        for line in file.readlines():
            if line.startswith('text to replace'):
                outfile.write(sentence)
            else:
                outfile.write(line)

答案 2 :(得分:0)

打开方式如下:

  • ''r''打开文本文件以供阅读。流位于         文件的开头。

  • ''r +''打开以进行读写。流已定位 在         文件的开头。

  • ''w''将文件截断为零长度或创建用于 写作。         流位于文件的开头。

  • ''w +''打开以进行读写。如果创建该文件 才不是         存在,否则将被截断。流位于         文件的开头。

  • ''a''开放写作。如果没有创建该文件 存在。的         流位于文件末尾。后续写入         到该文件将始终以该文件的当前结尾结束,         不管是否有任何fseek(3)或类似内容。

  • ''a +''打开以进行读写。如果创建该文件 才不是         存在。流位于文件的末尾。 Subse-         对文件的后续写入将始终以当时的状态结束         文件结尾,无论是否有任何fseek(3)或类似内容。

答案 3 :(得分:0)

示例代码不是问题,但想分享一下,因为这是我在寻找错误时的解决之道。

由于在Windows上附加到文件时选择了文件名(例如,con.txt),因此出现此错误。将扩展名更改为其他可能性会导致相同的错误,但是更改文件名可以解决此问题。原来,文件名选择导致重定向到控制台,从而导致错误(必须完全具有读或写模式之一):Why does naming a file 'con.txt' in windows make Python write to console, not file?