我正在尝试用python文件中的新字符串替换字符串,并将新字符串永久地写入它。当我运行下面的脚本时,它会删除部分字符串而不是所有字符串。文件中的字符串是:
self.id = "027FC8EBC2D1"
我必须替换字符串的脚本是:
def edit():
o = open("test.py","r+") #open
for line in open("test.py"):
line = line.replace("027FC8EBC2D1","NewValue")
o.write(line)
o.close()
edit()
感谢您的帮助。
答案 0 :(得分:5)
除非替换值和原始值具有完全相同的长度,否则您无法安全地执行您想要执行的操作。除非得到保证,否则我会复制文件:
with open('input.txt', 'r') as in_file:
with open('output.txt', 'w') as out_file:
for line in in_file:
line = line.replace('027FC8EBC2D1', 'NewValue')
out_file.write(line)
编辑(删除了误导性信息)
答案 1 :(得分:2)
尝试这样的事情:
import fileinput
for line in fileinput.input('test.py', inplace=1):
line.replace("027FC8EBC2D1","NewValue")
这使你调用fh.close()无关(处理它)并阻止你一次打开文件的多个副本。
答案 2 :(得分:2)
使用Python对文本文件执行(实际模拟 ;-)“就地替换”的正确方法是fileinput模块:
import fileinput
for line in fileinput.input(['test.py'], inplace=True):
print line.replace('027FC8EBC2D1', 'NewValue'),
注意另一个重要的细节,其他答案表明同一个模块:input
的第一个参数必须是文件名的列表(不是字符串!),并且,您执行必须print
生成的文件中所需的每一行(fileinput
重定向标准输出以执行 - 实际模拟 - “覆盖就地”效果)。
最后一个小但不可忽略的细节:print
语句末尾的逗号是为了避免在最后添加另一个换行符(因为每个line
已经以换行符结束了! - )
答案 3 :(得分:1)
您正在以只读方式打开文件并尝试写入该文件。而且你也一次打开它两次。
你需要重新组织它,以便你只打开一次,并且它是可读写的。
答案 4 :(得分:1)
如果你有足够的内存,与你的文件大小相比,你实际上可以逃脱这个:
# Open the file for read/write access
f = open( 'test.py', 'r+' )
# Read the entire contents of the file into memory
data = f.read()
# Replace the old value with the new one
data.replace( '027FC8EBC2D1', 'NewValue' )
# Truncate the file (in case NewValue is shorter than OldValue)
f.truncate( 0 )
# Write all the data out again
f.write( data )
# Close the file
f.close()
我不建议将它用于非常大的文件,但它会比您预期的更快。