简体   繁体   English

Python在二进制文件中搜索和替换

[英]Python search and replace in binary file

I am trying to search and replace some of the text (eg 'Smith, John') in this pdf form file (header.fdf, I presumed this is treated as binary file): 我试图在这个pdf格式文件中搜索并替换一些文本(例如'Smith,John')(header.fdf,我认为这被视为二进制文件):

'%FDF-1.2\n%\xe2\xe3\xcf\xd3\n1 0 obj\n<</FDF<</Fields[<</V(M)/T(PatientSexLabel)>><</V(24-09-1956  53)/T(PatientDateOfBirth)>><</V(Fisher)/T(PatientLastNameLabel)>><</V(CNSL)/T(PatientConsultant)>><</V(28-01-2010 18:13)/T(PatientAdmission)>><</V(134 Field Street\\rBlackburn BB1 1BB)/T(PatientAddressLabel)>><</V(Smith, John)/T(PatientName)>><</V(24-09-1956)/T(PatientDobLabel)>><</V(0123456)/T(PatientRxr)>><</V(01234567891011)/T(PatientNhsLabel)>><</V(John)/T(PatientFirstNameLabel)>><</V(0123456)/T(PatientRxrLabel)>>]>>>>\nendobj\ntrailer\n<</Root 1 0 R>>\n%%EOF\n'

After

f=open("header.fdf","rb")
s=f.read()
f.close()
s=s.replace(b'PatientName',name)

the following error occurs: 发生以下错误:

Traceback (most recent call last):
  File "/home/aj/Inkscape/Med/GAD/gad.py", line 56, in <module>
    s=s.replace(b'PatientName',name)
TypeError: expected an object with the buffer interface

How best to do this? 怎么做到最好?

f=open("header.fdf","rb")
s=str(f.read())
f.close()
s=s.replace(b'PatientName',name)

or 要么

f=open("header.fdf","rb")
s=f.read()
f.close()
s=s.replace(b'PatientName',bytes(name))

probably the latter, as I don't think you are going to be able to use unicode names with this type of substitution anyway 可能是后者,因为我认为你无论如何都不能使用这种类型的替换的unicode名称

You must be using Python 3.X. 您必须使用Python 3.X. You didn't define 'name' in your example, but it is the problem. 您没有在示例中定义“名称”,但这是问题所在。 Likely you defined it as a Unicode string: 您可能将其定义为Unicode字符串:

name = 'blah'

It needs to be a bytes object too: 它也需要是一个字节对象:

name = b'blah'

This works: 这有效:

Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('file.txt','rb')
>>> s = f.read()
>>> f.close()
>>> s
b'Test File\r\n'
>>> name = b'Replacement'
>>> s=s.replace(b'File',name)
>>> s
b'Test Replacement\r\n'

In a bytes object, the arguments to replace must both be bytes objects. bytes对象中,replace的参数必须都是 bytes对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM