“Se requiere un entero” cuando se abre () un archivo como utf-8?

Tengo un archivo que bash abrir en Python con la siguiente línea:

f = open("C:/data/lastfm-dataset-360k/test_data.tsv", "r", "utf-8") 

Llamar a esto me da el error.

TypeError: se requiere un entero

Eliminé todos los demás códigos además de esa línea y aún obtengo el error. ¿Qué he hecho mal y cómo puedo abrir esto correctamente?

De la documentación para open() :

open(name[, mode[, buffering]])

[…]

El argumento del búfer opcional especifica el tamaño de búfer deseado del archivo: 0 significa sin búfer, 1 significa búfer de línea, cualquier otro valor positivo significa usar un búfer de (aproximadamente) ese tamaño. Un búfer negativo significa usar el valor predeterminado del sistema, que generalmente es un búfer de línea para dispositivos tty y un búfer completo para otros archivos. Si se omite, se utiliza el valor predeterminado del sistema.

Parece que intentas pasar open() una cadena que describe la encoding del archivo como el tercer argumento. No hagas eso

Estás utilizando la apertura incorrecta.

 >>> help(open) Help on built-in function open in module __builtin__: open(...) open(name[, mode[, buffering]]) -> file object Open a file using the file() type, returns a file object. This is the preferred way to open a file. See file.__doc__ for further information. 

Como puede ver, espera el parámetro de almacenamiento en búfer que es un entero.

Lo que probablemente quieras es codecs.open :

 open(filename, mode='rb', encoding=None, errors='strict', buffering=1) 

De los documentos de ayuda:

 open(...) open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True) -> file object 

necesitas encoding='utf-8' ; Python cree que está pasando un argumento para el almacenamiento en búfer.

El último parámetro que se open es el tamaño del búfer, no la encoding del archivo.

Las secuencias de archivos son más o menos agnósticas a la encoding (con la excepción de la traducción de nueva línea en archivos que no se abren en modo binario), debe manejar la encoding en otro lugar (por ejemplo, cuando recibe los datos con una llamada a read() , puede interpretarlos como utf-8 utilizando su método de decode ).

Esto resolvió mi problema, es decir, proporcionar una encoding (utf-8) al abrir el archivo

  with open('tomorrow.txt', mode='w', encoding='UTF-8', errors='strict', buffering=1) as file: file.write(result)