如何按位置从文件中删除符号

How to delete a symbol from file by its position

提问人:TimKostenok 提问时间:8/1/2023 最后编辑:TimKostenok 更新时间:8/1/2023 访问量:25

问:

我需要通过它在文件中的位置从 txt 文件中删除一个符号。例如,有一个文本文件:sample.txt

Hello, world!
Abcdef
hello
world

我需要删除位于第六个位置的字符:,pos = 6

我尝试使用以下代码:

pos = 6

with open('sample.txt', 'r+') as f:
    f.seek(pos - 1) # move to the position before ,
    print(f.read(1)) # print the , character
    f.seek(pos - 1) # return back to the position before ,
    f.write('\r')
    f.close()

这打印,就像我预期的那样,但文件现在看起来像这样:,

Hello
 world!
Abcdef
hello
world

所以我的代码用新的行符号替换了字符,而不是回车符号。,\n\r

更新:

我的解决方案将符号替换为带有 ASCII 代码 13 (0D) 的符号,这并不能解决我的问题:,

gggg

python 文件 io char

评论

1赞 Barmar 8/1/2023
如果文件未以二进制模式打开,我会收到错误。f.seek(-1, 1)
0赞 Barmar 8/1/2023
然后它要求调用我写一个字节字符串,而不是一个常规字符串。
0赞 Barmar 8/1/2023
查看 stackoverflow.com/questions/53001901/...
2赞 Barmar 8/1/2023
可能只是您查看文件的方式将 CR 显示为换行符。尝试使用十六进制编辑器查看文件。
1赞 Barmar 8/1/2023
我怀疑 VSCode 正在将 CR 转换为换行符。

答:

1赞 Barmar 8/1/2023 #1

VSCode 将 CR 显示为换行符。

要完全删除它,请不要用单个字符覆盖它。将文件的其余部分读入变量中,返回该位置,然后覆盖该变量。

pos = 6

with open('sample.txt', 'r+') as f:
    f.seek(pos - 1) # move to the position before ,
    print(f.read(1)) # print the , character
    rest = f.read() # read the rest of the file
    f.seek(pos - 1) # return back to the position before ,
    f.write(rest)
    f.truncate() # adjust the end of the file

顺便说一句,你不需要,当你使用时会自动完成。f.close()with