2015-06-08 17 views
9

Ich versuche, eine Liste von Daten in eine CSV-Datei zu schreiben. Da das es ist eine Liste von Byte-Strings, habe ich den Code untenTypeError: Codierung oder Fehler ohne String-Argument

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

Aber es ergibt sich folgende Fehler:

TypeError: encoding or errors without a string argument

datas ist eine Liste der Byte-Strings.

print(datas) 

ergibt

[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] 

I Die oben aufgeführte Liste soll als erste Zeile in einer CSV-Datei mit der Decodierung von Unicode-Zeichen gedruckt werden. Das heißt, \xc3\x97 sollte in das entsprechende Zeichen konvertiert werden.

+0

Da Sie Bytes zurück in String konvertieren möchten, sollte es nicht 'str (Daten, 'UTF-8')' stattdessen sein? (Auch sollten Sie es nicht für jedes der Elemente anwenden, anstatt für die gesamte Liste?) –

+0

Auch sollten 'data' für' writerows' eine Liste von Listen sein? –

+0

@tobias_k zeigt 'TypeError: coercing to str: brauche ein bytesähnliches Objekt, Liste gefunden' –

Antwort

8

Es scheint, Ihre datasist bereits in Byte-Format, so dass es in UTF-8-Strings zu drehen, haben Sie str zu verwenden, nicht bytes! Außerdem müssen Sie jedes Element einzeln von datas konvertieren, nicht die gesamte Liste auf einmal. Wenn Sie schließlich datas als eine Zeile zu out.csv hinzufügen möchten, müssen Sie writerow verwenden, während writerows die Zeilen alle gleichzeitig schreiben und entsprechend eine Liste von Listen erwarten würde.

Je nach Betriebssystem müssen Sie beim Öffnen der Datei möglicherweise auch encoding angeben. Andernfalls wird die Standardcodierung des Betriebssystems verwendet, was etwas völlig anderes sein kann.

Diese scheint zu tun, was Sie wollen. Das Ergebnis ist eine CSV-Datei mit einer Zeile von Daten im UTF-8-Format und die \xc3\x97 wird zu × decodiert.

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) anzumerken, dass das letzte Element in datas einige Zeilenumbrüche enthält, und wird somit auf mehrere Linien aufgespalten werden. Dies ist wahrscheinlich nicht das, was Sie wollen. Oder ist das ein Fehler in Ihrer datas Liste?

+0

Addendum: Wenn Sie den Unicode entschlüsseln wollen, aber '\ n' entkommen lassen, können Sie versuchen,' repr (str (d, 'UTF-8')) '', aber ich bin mir nicht sicher, ob Sie das wollen. Dies wird auch alle Zeichenfolgen in '''' –

+0

versucht, dass, aber es zeigt 'TypeError: 'str' unterstützt nicht die Pufferschnittstelle ' –

+0

@AvinashRaj Ich habe diesen Fehler zu, behoben, indem Sie den Dateimodus von' wb' zu 'w'. (Ich glaube nicht, dass 'b' (binär) für eine CSV-Datei sinnvoll ist) Sorry, habe vergessen, diese Änderung zu erwähnen. –

Verwandte Themen