我正在尝试打开由测量设备创建的文件,找到与元数据对应的字节,然后将其他所有内容写入新的二进制文件。 (元数据部分不是问题:我知道标题并且可以轻松找到它们。让我们不要担心。)
问题是:当我打开文件并将字节写入新文件时,会添加新的字节,这会混淆相关数据。具体来说,每次原始文件中都有一个'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字节。
由于代码非常简单,我认为错误来自读取函数(或者可能来自OS的一些不可避免的固有行为......我在Windows上使用python 2.7,BTW。) 我最初也怀疑数据格式,但在我看来应该无关紧要。我只是在复制一切,无论价值如何。
我发现没有可以提供帮助的文档,所以......有人知道是什么造成的吗?
编辑:顺便说一句,同样的脚本在Linux上运行正常。因此虽然这不是一个大问题,但它非常烦人。
答案 0 :(得分:4)
欢迎来到行尾标记的世界!在Windows下以文本模式打开文件时,任何原始\n
(十六进制0x0a)将写为\r\n
(十六进制0x0d 0x0a)。
幸运的是,它很容易修复:只需以二进制模式打开文件(注意 b ):
with open(..., 'ab') as data_...:
并且不受欢迎的\r
将不再打扰您: - )