2015-06-08 17 views
9

Próbuję zapisać listę danych do pliku csv. Ponieważ jest to lista ciągów bajtów, użyłem poniższy kodTypeError: kodowanie lub błędy bez argumentu łańcuchowego

with open(r"E:\Avinash\Python\extracting-drug-data\out.csv", "wb") as w: 
    writer = csv.writer(w) 
    writer.writerows(bytes(datas, 'UTF-8')) 

Ale to prowadzi do następującego błędu:

TypeError: encoding or errors without a string argument

datas jest listą ciągów bajtów.

print(datas) 

daje

[b'DB08873', b' MOLSDFPDBSMILESInChIView Structure \xc3\x97Structure for DB08873 (Boceprevir) Close', b'394730-60-0', b'LHHCSNFAOIFYRV-DOVBMPENSA-N', b'Organic acids and derivatives ', b'Food increases exposure of boceprevir by up to 65% relative to fasting state. However, type of food and time of meal does not affect bioavailability of boceprevir and thus can be taken without regards to food. \r\nTmax = 2 hours;\r\nTime to steady state, three times a day dosing = 1 day;\r\nCmax] 

że chce powyższa lista drukuje się w pierwszym rzędzie w csv z dekodowaniem unicode. To znaczy, \xc3\x97 powinien zostać przekonwertowany na odpowiadający mu znak.

+0

Ponieważ chcesz przekonwertować bajty z powrotem na ciąg, czy nie powinno to być 'str (datas, 'UTF-8')' zamiast? (Czy nie powinieneś zastosować go do każdego z elementów, zamiast do całej listy?) –

+0

Również w przypadku 'writerows', czy' datas' nie powinien być listą list? –

+0

@tobias_k pokazuje 'TypeError: przymuszanie do str: potrzeba obiektu podobnego do bajtów, lista znaleziona' –

Odpowiedz

8

Wydaje Twój datasjest już w formacie bajtach, tak aby przekształcić go w UTF-8 ciągi, trzeba użyć str, nie bytes! Konieczne jest także indywidualne przekonwertowanie każdego elementu od datas, a nie całej listy naraz. Na koniec, jeśli chcesz dodać datas jako jeden wiersz do out.csv, musisz użyć writerow, podczas gdy writerows będzie pisać wszystkie wiersze naraz i zręcznie oczekiwać listy list.

W zależności od systemu operacyjnego podczas otwierania pliku może być konieczne podanie wartości encoding. W przeciwnym razie użyje domyślnego kodowania systemu operacyjnego, co może być czymś zupełnie innym.

Ten wydaje się być, aby zrobić, co chcesz. Wynikiem jest plik CSV z jednym wierszem danych w formacie UTF-8, a \xc3\x97 jest dekodowany do ×.

import csv 
with open(r"out.csv", "w", encoding='UTF-8') as w: 
    writer = csv.writer(w) 
    writer.writerow([str(d, 'UTF-8') for d in datas]) 

1) Zauważ, że ostatni element w datas zawiera pewne podziały wiersza, a tym samym będą podzielone na kilka linii. To prawdopodobnie nie jest to, czego chcesz. A może to usterka na twojej liście datas?

+0

Dodatek: Jeśli chcesz dekodować kod Unicode, ale 'uciekłeś' \ n, możesz spróbować 'repr (str (d, 'UTF-8'))', ale nie jestem pewien, czy tego właśnie chcesz. Spowoduje to również zawinięcie wszystkich łańcuchów w '' '' –

+0

wypróbowanych, ale pokazuje' TypeError:' str 'nie obsługuje interfejsu bufora' –

+0

@AvinashRaj Dostałem ten błąd, naprawiłem go zmieniając tryb pliku z ' wb' na 'w'. (Nie sądzę, że "b" (binarny) ma sens dla pliku CSV) Przepraszamy, zapomniałem wspomnieć o tej zmianie. –

Powiązane problemy