2012-04-01 16 views
6

Mam plik próbuję otworzyć w Pythonie z następującej linii:"wymagana jest liczba całkowita" po otwarciu() pliku jako utf-8?

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

Wywołanie to daje mi błąd

TypeError: an integer is required

ja usunięte wszystkie inne kody oprócz tej jednej linii i nadal otrzymuję błąd. Co zrobiłem źle i jak mogę to poprawnie otworzyć?

+0

Czego traceback powiedzenia? Czy ostatnia linia to 'f = open (...)', czy wewnątrz rdzeniowych bibliotek Pythona? – ninjagecko

+0

To jest f = otwarta (...) linia – Jim

+1

której wersji Pythona? 3.x? lub 2.x? – gbulmer

Odpowiedz

11

Z dokumentacji dla open():

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

[...]

The optional buffering argument specifies the file’s desired buffer size: 0 means unbuffered, 1 means line buffered, any other positive value means use a buffer of (approximately) that size. A negative buffering means to use the system default, which is usually line buffered for tty devices and fully buffered for other files. If omitted, the system default is used.

Jesteś wydają się być stara się przekazać open() łańcuch opisujący kodowanie pliku jako trzeci argument zamiast. Nie rób tego.

+3

Strzelaj. Masz rację. Chciałem użyć codecs.open. Dzięki! – Jim

1

Ostatni parametr dla open to rozmiar bufora, a nie kodowanie pliku.

strumienie plików są bardziej lub mniej kodowania-agnostyk (z wyjątkiem tłumaczenie nowej linii w plikach nie otwartych w trybie binarnym), należy poradzić kodowania w innym miejscu (np kiedy masz dane z read() rozmowy, można go interpretować jako utf-8 za pomocą metody decode).

7

Używasz złego otwarcia.

>>> 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. 

Jak widać oczekuje się parametru buforującego będącego liczbą całkowitą.

Co prawdopodobnie chcesz to codecs.open:

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

Od docs Pomoc:

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

trzeba encoding='utf-8'; python myśli, że przekazujesz argument do buforowania.

0

ten rozwiązany mój problem, a mianowicie udzielanie kodowania (UTF-8) podczas otwierania pliku

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