TypeError: elemento de secuencia 1: se esperaba un objeto similar a bytes, se encontró str

Estoy intentando extraer títulos en inglés de un volcado de títulos de wiki que está en un archivo de texto usando expresiones regulares en Python 3. El volcado de wiki contiene títulos en otros idiomas también y algunos símbolos. A continuación se muestra mi código:

with open('/Users/some/directory/title.txt', 'rb')as f: text=f.read() letters_only = re.sub(b"[^a-zA-Z]", " ", text) words = letters_only.lower().split() print(words) 

Pero estoy recibiendo un error:

 TypeError: sequence item 1: expected a bytes-like object, str found 

en la línea: letters_only = re.sub(b"[^a-zA-Z]", " ", text)

Pero, estoy usando b'' para hacer una salida como tipo de byte, a continuación se muestra un ejemplo del archivo de texto:

 Destroy-Oh-Boy!! !!Que_Corra_La_Voz!! !!_(chess) !!_(disambiguation) !'O!Kung !'O!Kung_language !'O-!khung_language !337$P34K != !? !?! !?Revolution!? !?_(chess) !A_Luchar! !Action_Pact! !Action_pact! !Adios_Amigos! !Alabadle! !Alarma! !Alarma!_(album) !Alarma!_(disambiguation) !Alarma!_(magazine) !Alarma!_Records !Alarma!_magazine !Alfaro_Vive,_Carajo! !All-Time_Quarterback! !All-Time_Quarterback!_(EP) !All-Time_Quarterback!_(album) !Alla_tu! !Amigos! !Amigos!_(Arrested_Development_episode) !Arriba!_La_Pachanga !Ask_a_Mexican! !Atame! !Ay,_Carmela!_(film) !Ay,_caramba! !BANG! !Bang! !Bang!_TV !Basta_Ya! !Bastardos! !Bastardos!_(album) !Bastardos_en_Vivo! !Bienvenido,_Mr._Marshall! !Ciauetistico! !Ciautistico! !DOCTYPE !Dame!_!Dame!_!Dame! !Decapitacion! !Dos! !Explora!_Science_Center_and_Children's_Museum !F !Forward,_Russia! !Forward_Russia! !Ga!ne_language !Ga!nge_language !Gã!ne !Gã!ne_language !Gã!nge_language !HERO !Happy_Birthday_Guadaloupe! !Happy_Birthday_Guadalupe! !Hello_Friends 

He buscado en línea pero no he tenido éxito. Cualquier ayuda será apreciada.

Tienes que elegir entre el modo binario y el modo texto.

O abre su archivo como rb y luego puede usar re.sub(b"[^a-zA-Z]", b" ", text) (el text es un objeto de bytes )

O abre su archivo como r y luego puede usar re.sub("[^a-zA-Z]", " ", text) (el text es un objeto str )

La segunda solución es más “clásica”.

El problema es con el argumento repl que proporcionas, no es un objeto de bytes :

 letters_only = re.sub(b"[^a-zA-Z]", " ", b'Hello2World') # TypeError: sequence item 1: expected a bytes-like object, str found 

En su lugar, suministre repl como una instancia de bytes b" " :

 letters_only = re.sub(b"[^a-zA-Z]", b" ", b'Hello2World') print(letters_only) b'Hello World' 

Nota: no prefija sus literales con b y no abra el archivo con rb si no está buscando secuencias de byte .

No puede usar una cadena de byte para su coincidencia de expresiones regulares cuando la cadena de reemplazo no lo es.
Esencialmente, no puede mezclar diferentes objetos ( byte y string ) al realizar la mayoría de las tareas. En su código anterior, está utilizando una cadena de búsqueda binaria y un texto binario, pero su cadena de reemplazo es una string normal. Todos los argumentos deben ser del mismo tipo, por lo que hay 2 soluciones posibles para esto.

Teniendo en cuenta lo anterior, su código podría tener este aspecto (esto devolverá string caracteres normales, no objetos de byte ):

 with open('/Users/some/directory/title.txt', 'r')as f: text=f.read() letters_only = re.sub(r"[^a-zA-Z]", " ", text) words = letters_only.lower().split() print(words) 

Tenga en cuenta que el código utiliza un tipo especial de cadena para las expresiones regulares: una cadena sin formato, con el prefijo r . Esto significa que Python no interpretará caracteres de escape como \ , lo que es muy útil para expresiones regulares. Consulte la documentación para obtener más detalles sobre las cadenas en bruto.