【问题标题】:Copying from a binary file using Python inserts new bytes (?)使用 Python 从二进制文件复制会插入新字节(?)
【发布时间】:2016-08-09 13:02:02
【问题描述】:

我正在尝试打开一个由测量设备创建的文件,找到与元数据对应的字节,然后将其他所有内容写入一个新的二进制文件。 (元数据部分不是问题:我知道标题并且可以轻松找到它们。我们不用担心。)

问题是:当我打开文件并将字节写入新文件时,会添加新字节,这会弄乱相关数据。具体来说,每当原始文件中有一个“0A”字节时,新文件前面就有一个“0D”字节。 我已经经历了几次精简代码以找到问题的迭代。这是最新和最简单的版本,以三种不同的方式产生相同的结果:

import os
import mmap

file_name = raw_input('Name of the file to be edited: ')
f = open(file_name, 'rb') 

#1st try: using mmap, to make the metadata sarch easier
s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
full_data = s.read(len(s))
with open(os.path.join('.', 'edited', ('[mmap data]' + file_name + '.bin')), 'a') as data_mmap:
    data_mmap.write(full_data)

#2nd try: using bytes, in case mmap was giving me trouble

f_byte = bytes(f.read())
with open(os.path.join('.', 'edited', ('[bytes data]' + file_name + '.bin')), 'a') as data_bytes:
    data_bytes.write(f_byte)

s.close()
f.close()

#3rd try: using os.read/write(file) instead of file.read() and file.write().
from os.path import getsize

o = os.open(file_name,os.O_BINARY)  #only available on Windows
f_os = bytes(os.read(o,getsize(file_name)))
with open(os.path.join('.', 'edited', ('[os data]' + file_name + '.bin')), 'a') as data_os:
    os.write(data_os.fileno(),f_os)

os.close(o)

生成的文件都是相同的(与 HxD 相比)。它们几乎与原始文件相同,除了是单个新字节。例如,从偏移量 0120 开始,原始文件读取: A0 0A 00 00 而新文件显示: A0 0D 0A 00 ...然后一切都完全相同,直到原始文件中下一次出现 0A,再次出现 0D 字节。

由于代码非常简单,我假设错误来自读取函数(或者可能来自操作系统的一些不可避免的固有行为......我在 Windows 上使用 python 2.7,顺便说一句。) 起初我也怀疑数据格式,但在我看来它应该无关紧要。我只是复制一切,不考虑价值。

我没有找到可以提供帮助的文档,所以...有人知道是什么原因造成的吗?

编辑:顺便说一下,同样的脚本在 Linux 上也能正常工作。所以虽然这不是什么大问题,但它非常非常烦人。

【问题讨论】:

  • 您以二进制模式打开源文件,但以文本模式打开目标文件。以二进制模式打开这两个文件,Python 不会修改你的换行符。

标签: python binaryfiles


【解决方案1】:

欢迎来到行尾标记的世界!在 Windows 下以文本模式打开文件时,任何原始的 \n (hex 0x0a) 都将被写入 \r\n (hex 0x0d 0x0a)。

幸运的是它很容易修复:只需以二进制模式打开文件(注意 b):

with open(..., 'ab') as data_...:

不需要的\r 将不再打扰你:-)

【讨论】:

  • 该死的。我知道它必须是简单的,我不知道它会这么简单!谢谢!
猜你喜欢
  • 2013-05-13
  • 2012-08-31
  • 2015-05-15
  • 2017-10-05
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多