【问题标题】:How to seek and append to a binary file in python?如何在python中查找并附加到二进制文件?
【发布时间】:2010-12-08 13:50:20
【问题描述】:

我在将数据附加到二进制文件时遇到问题。当我 seek() 到一个位置,然后 write() 在那个位置然后读取整个文件时,我发现数据没有写入我想要的位置。相反,我在所有其他数据/文本之后找到它。

我的代码

file = open('myfile.dat', 'wb')
file.write('This is a sample')
file.close()

file = open('myfile.dat', 'ab')
file.seek(5)
file.write(' text')
file.close()

file = open('myfile.dat', 'rb')
print file.read()  # -> This is a sample text

您可以看到seek 不起作用。我该如何解决这个问题?还有其他方法可以实现吗?

谢谢

【问题讨论】:

  • 注意二进制模式并不重要。您可以使用文本模式重现相同的问题。

标签: python file seek


【解决方案1】:

在某些系统上,'ab' 强制所有写入发生在文件末尾。你可能想要'r+b'

【讨论】:

  • 来自seek 方法的文档:“如果文件仅以追加模式(模式'a')打开写入,则此方法本质上是无操作的,”
  • @bgporter:你是支持还是反驳我说的话?老实说,我说不出来。
  • 对不起——支持!只是添加文档中的实际文本,试图澄清(但显然失败了..)
  • 不直观的部分是文档说'r+' 打开文件以进行读取和更新 - 后者暗示能够写入。跨度>
【解决方案2】:

r+b 应该如你所愿

【讨论】:

    【解决方案3】:

    省略 seek 命令。您已经打开文件以追加 'a'。

    【讨论】:

    • 从示例代码来看,我认为OP不想追加到文件末尾。
    • 您可能是正确的,但我认为结果应该是“这是一个示例文本”。 :)
    • 我认为这应该是公认的答案。由于seek 命令,'r+b' 仅适用于 OP。
    【解决方案4】:

    注意:记住新字节而不是以前的字节

    根据 python 3 语法

    with open('myfile.dat', 'wb') as file:
        b = bytearray(b'This is a sample')
        file.write(b)
    
    with open('myfile.dat', 'rb+') as file:
        file.seek(5)
        b1 = bytearray(b'  text')
        #remember new bytes over write previous bytes
        file.write(b1)
    
    with open('myfile.dat', 'rb') as file:
        print(file.read())
    

    输出

    b'This   textample'
    

    记住新字节而不是写入以前的字节

    【讨论】:

    • 那么,我们如何将这两个变量写入一个文件并读取它们?
    • 你的意思是把它们写在不同的行上吗?在这种情况下,您可以第二次使用 file.seek(len(b)) 。或者最好的方法是在以写入模式打开文件时一个接一个地写入两个变量。然后关闭文件。下次以阅读模式打开文件并读取所有内容
    • 它不必在不同的行,我已经发布了一个关于这个的问题。 stackoverflow.com/questions/60795901/…。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2015-06-13
    • 2016-08-05
    相关资源
    最近更新 更多