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 verwenden csv.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.
InformationsquelleAutor FSRubyc | 2017-04-14
Schreibe einen Kommentar