我有一个打开的文件,我想搜索直到在行首找到一个特定的文本短语。然后,我想用“句子”覆盖该行
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
我该如何工作?
答案 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?