在浏览了整个互联网之后,我得出了这个结论。
假设我已经创建了一个文本文件,其内容为:Hello World
嗯,我想从这个文本文件中删除最后一个字符(在本例中是d
)。
因此,文本文件现在应该如下所示:Hello Worl
但我不知道该怎么做。
所有我想要的,或多或少,是一个单一的退格功能,在我的硬盘上的文本文件。
这需要在Linux上工作,因为这就是我正在使用的。
发布于 2013-09-18 02:36:25
使用fileobject.seek()
从末尾开始查找1个位置,然后使用file.truncate()
删除文件的其余部分:
import os
with open(filename, 'rb+') as filehandle:
filehandle.seek(-1, os.SEEK_END)
filehandle.truncate()
这对于单字节编码很有效。如果您使用多字节编码(如UTF-16或UTF-32),则需要从末尾查找足够的字节来表示单个代码点。
对于可变字节编码,取决于编解码器是否可以使用此技术。对于UTF-8,您需要找到bytevalue & 0xC0 != 0x80
为true的第一个字节(从末尾开始),并从该位置开始截断。这可以确保您不会在多字节UTF-8代码点中间截断:
with open(filename, 'rb+') as filehandle:
# move to end, then scan forward until a non-continuation byte is found
filehandle.seek(-1, os.SEEK_END)
while filehandle.read(1) & 0xC0 == 0x80:
# we just read 1 byte, which moved the file position forward,
# skip back 2 bytes to move to the byte before the current.
filehandle.seek(-2, os.SEEK_CUR)
# last read byte is our truncation point, move back to it.
filehandle.seek(-1, os.SEEK_CUR)
filehandle.truncate()
请注意,UTF-8是ASCII的超集,因此上述方法也适用于ASCII编码的文件。
发布于 2018-10-15 09:45:23
如果你不是在二进制模式下读取文件,而你只有'w‘权限,我可以建议你这样做。
f.seek(f.tell() - 1, os.SEEK_SET)
f.write('')
在上面的代码中,f.seek()
将只接受您没有'b‘访问权限的f.tell()
b/c。然后,您可以将光标设置为最后一个元素的开始位置。然后,您可以通过空字符串删除最后一个元素。
发布于 2013-09-18 02:38:22
with open(urfile, 'rb+') as f:
f.seek(0,2) # end of file
size=f.tell() # the size...
f.truncate(size-1) # truncate at that size - how ever many characters
请务必在windows上使用二进制模式,因为Unix文件行末尾的许多行都会返回illegal or incorrect字符数。
https://stackoverflow.com/questions/18857352
复制相似问题