我想在Python的文本文件中插入一行,所以我试过
with open(erroredFilepath, 'r+t') as erroredFile:
fileContents = erroredFile.read()
if 'insert_here' in fileContents:
insertString.join(fileContents.rsplit('insert_here'))
erroredFile.truncate()
erroredFile.write(insertString)
但是,insertString
写在文件的末尾。为什么呢?
顺便说一下,我只是使用字符串而不是文件来尝试简单的事情。
'123456789'.join('qwertyuiop'.split('y'))
给出
'qwert123456789uiop'
'y'发生了什么?
答案 0 :(得分:3)
如果要在文件中间写入
fileinput
模块。
import fileinput
for line in fileinput.input("C:\\Users\\Administrator\\Desktop\\new.txt",inplace=True):
print "something", #print("something", end ="") for python 3
remember whatever you print that will go in the file.So you have to read and print every line and modify whichever you want to replace.Also use
打印“asd”,...the
,at the end is important as It will prevent
打印from putting a newline there.
答案 1 :(得分:2)
虽然文件的操作系统级详细信息有所不同,但通常情况下,当您在r+
模式下打开文件并执行某些读取或写入操作时,“当前位置”将在最后一次读取或写入后保留。
当你这样做时:
fileContents = erroredFile.read()
流erroredFile
被读到最后,因此当前位置现在“在结尾”。
truncate函数默认使用当前位置作为要截断的大小。假设文件长度为100个字节,那么当前位置“在末尾”是字节100.然后:
erroredFile.truncate()
表示“使文件长100个字节” - 它已经存在。
当前位置保留在文件的末尾,因此后续的write
会附加。
大概你想要回到文件的开头,和/或使用truncate(0)
(注意只有truncate(0)
,至少在类Unix系统上,将把搜索位置留在文件的结尾,以便下一个write
留下原始数据曾经存在的洞。您也可以稍微聪明一点:如果您正在插入,只需覆盖和扩展(根本不需要truncate
)。
(Joel Hinz已经回答了第二个问题,我明白了。)
答案 2 :(得分:0)
不是Python的答案,但它可能会拓宽你的视野。使用sed
:
$ cat input.txt
foo
bar
baz
INSERT HERE
qux
quux
$ sed '/INSERT HERE/anew stuff' < input.txt
foo
bar
baz
INSERT HERE
new stuff
qux
quux
命令a
会将文本附加到新行。如果要在匹配之前插入文本,请使用命令i
:
$ sed '/INSERT HERE/inew stuff' < input.txt
foo
bar
baz
new stuff
INSERT HERE
qux
quux
答案 3 :(得分:0)
为什么不尝试两步解决方案?首先,您阅读并修复字符串,在第二步,您重写文件。可能它不是最有效的算法,但我认为它有效。
with open(erroredFilepath, 'r') as erroredFile:
fileContents = erroredFile.read()
fileContents.replace('insert_here', 'insert_string')
with open(erroredFilePath, 'w') as fixingFile:
fixingFile.write(fileContents)