csv-Klasse-Verfasser : ein bytes-Objekt wie erforderlich ist, nicht 'str'
Für ein persönliches Projekt, das ich versuche zu aktualisieren, die paterns Paket Python 3.
Eigentlich bin ich mit der test:db.py aber ich bin stecken mit dem folgenden Fehler in der '__init__.py' Datei, auf eine csv-Klasse:
Dies ist der code-snippet od der speichern() Funktion:
dort haben wir dfine s als BytesIO() stream, also die Funktion ist gefragt, um Byte-stream zu einem selbst csv-Datei.
Der Fehler kommt aus der Zeile:
w.writerows([[csv_header_encode(name, type) for name, type in self.fields]])
TypeError: a bytes-like object is required, not 'str' ( below, also the code for this function)
soll, dass csv_header_encode zu liefern, bytes, und ich überprüfte, und es tut, aber irgendwie, in seiner Umwandlung die Liste ändert sich zu 'str'.
Und wenn ich die s Kodierung, StringsIO dann das Klagen kommt von
f.write(BOM_UTF8)
Jede Hilfe wird geschätzt.
def save(self, path, separator=",", encoder=lambda v: v, headers=False, password=None, **kwargs):
""" Exports the table to a unicode text file at the given path.
Rows in the file are separated with a newline.
Columns in a row are separated with the given separator (by default, comma).
For data types other than string, int, float, bool or None, a custom string encoder can be given.
"""
# Optional parameters include all arguments for csv.writer(), see:
# http://docs.python.org/library/csv.html#csv.writer
kwargs.setdefault("delimiter", separator)
kwargs.setdefault("quoting", csvlib.QUOTE_ALL)
# csv.writer will handle str, int, float and bool:
s = BytesIO()
w = csvlib.writer(s, **kwargs)
if headers and self.fields is not None:
w.writerows([[csv_header_encode(name, type) for name, type in self.fields]])
w.writerows([[encode_utf8(encoder(v)) for v in row] for row in self])
s = s.getvalue()
s = s.strip()
s = re.sub("([^\"]|^)\"None\"", "\\1None", s)
s = (s if not password else encrypt_string(s, password)).encode('latin-1')
f = open(path, "wt")
f.write(BOM_UTF8)
f.write(s)
f.close()
def csv_header_encode(field, type=STRING):
# csv_header_encode("age", INTEGER) => "age (INTEGER)".
t = re.sub(r"^varchar\(.*?\)", "string", (type or ""))
t = t and " (%s)" % t or ""
return "%s%s" % (encode_utf8(field or ""), t.upper())
- Können Sie uns zeigen, ein Beispiel, warum Sie brauchen, die
re.sub("([^\"]|^)\"None\"", "\\1None", s)
Ersatz? Das sieht wahrscheinlich brechen Sie Ihre CSV-Ausgabe für börsennotierte Werte. - Ah, Sie versuchen, unquote
None
strings? Eine korrekte CSV-reader entfernen die Zitate jedenfalls wieder, warum die Mühe? Sie sollten wahrscheinlich nicht verwendencsv.QUOTE_ALL
, und lassen Sie einfach zitieren, der Schriftsteller. - Dies ist das original-code. Wie ich schon sagte, ich war gerade versucht zu aktualisieren, es mit minimalen mods.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möglicherweise versuchen Sie, zu schreiben, zu einem
BytesIO
Objekt, abercsv.writer()
Angebote in strings nur. Aus dercsv
writer-Objekte-Dokumentation:Hervorhebung von mir.
csv.writer()
erfordert auch eine text - Datei zu schreiben; das Objekt erzeugt strings:Entweder ein
io.StringIO
Objekt statt, oder wickeln Sie dasBytesIO
Objekt in einerio.TextIOWrapper
Objekt zu handhaben-Codierung für Sie. So oder so, werden Sie brauchen, um passieren in Unicode-text umcsv.writer()
.Weil Sie später auf die Behandlung der
s.getvalue()
Daten als strings wieder (mit regular expressions definiert als Zeichenketten, und die Verwendung der Codierung Latin-1), werden Sie wahrscheinlich wollen, zu schreiben, um text-Datei (soStringIO
).Dass
f.write(BOM_UTF8)
ausfällt, ist eine separate Ausgabe.f
war geöffnet im text-Modus ('wt'
), so erwartet die Saiten, nichtbytes
. Wenn Sie möchten, zu schreibentext an eine Datei als UTF-8 kodiert mit UTF-8 BOM am Anfang können Sie die
utf-8-sig
Codierung beim öffnen der Datei:In der Regel, Sie zu sein scheinen mischen bytes und strings in all den falschen Wege. Lassen Sie text als text so lange wie möglich, und nur codieren, der am letzten möglichen Augenblick. Hier, dass wäre jetzt, beim schreiben in die Datei an der Stelle
path
, und lassen Sie die Codierung ganz auf das file-Objekt.