Python busca y reemplaza en archivo binario

Estoy intentando buscar y reemplazar parte del texto (por ejemplo, ‘Smith, John’) en este archivo de formulario pdf (header.fdf, supongo que esto se trata como un archivo binario):

'%FDF-1.2\n%\xe2\xe3\xcf\xd3\n1 0 obj\n<</FDF<</Fields[<><><><><><><><><><><><>]>>>>\nendobj\ntrailer\n<>\n%%EOF\n' 

Después

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

se produce el siguiente error:

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

¿Cómo mejor hacer esto?

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

o

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

probablemente el último, ya que no creo que puedas usar nombres Unicode con este tipo de sustitución de todos modos

Debes estar usando Python 3.X. No definió “nombre” en su ejemplo, pero es el problema. Es probable que lo hayas definido como una cadena Unicode:

 name = 'blah' 

También tiene que ser un objeto de bytes:

 name = b'blah' 

Esto funciona:

 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' 

En un objeto de bytes , los argumentos para reemplazar deben ser objetos de bytes .