Sie suchten nach Erklärungen gefragt, aber einige der Phänomene sind unerklärlich ohne Ihre Hilfe.
(A) Zeichenketten in XLS-Dateien, die ab Excel 97 erstellt wurden, werden in Latin1 kodiert, wenn möglich in UTF16LE. Jede Zeichenfolge trägt eine Flagge, die angibt, welche verwendet wurde. Frühere Excels codierten Strings entsprechend der "Codepage" des Benutzers. In jedem Fall erzeugt xlrd Unicode-Objekte. Die Dateicodierung ist nur dann von Interesse, wenn die XLS-Datei von Software von Drittanbietern erstellt wurde, die entweder die Codepage weglässt oder darüber lügt. Siehe den Unicode-Abschnitt oben in den xlrd-Dokumenten.
(B) unerklärliches Phänomen:
Dieser Code:
bcw = csv.writer(bc,csv.excel,b.encoding)
verursacht die folgenden Fehler mit Python 2.5, 2.6 und 3.1: TypeError: expected at most 2 arguments, got 3
- das ist, was ich die Dokumentation gegeben erwarten würde auf csv.writer; Es erwartet ein dateiähnliches Objekt, gefolgt von (1) nichts (2) einem Dialekt oder (3) einem oder mehreren Formatierungsparametern. Du hast ihm einen Dialekt gegeben, und csv.writer hat kein Codierungsargument, also splat. Welche Version von Python verwendest du? Oder haben Sie das Skript, das Sie tatsächlich ausgeführt haben, nicht kopiert/eingefügt?
(C) Unerklärliche Phänomene um Traceback und was die tatsächliche anstößigen Daten war:
"the_script.py", line 40, in <module>
this_row.append(str(s.cell_value(row,col)))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xed' in position 5: ordinal not in range(128)
ERSTENS, gibt es eine str() in der Linie säumige Code, der nicht in der vereinfachten Skript war - du hast Kopieren Sie nicht das Skript, das Sie tatsächlich ausgeführt haben? In jedem Fall solltest du str nicht generell benutzen - du wirst nicht die volle Präzision auf deinen Floats bekommen; Lass es einfach vom CSV-Modul konvertieren.
SECONDY, Sie sagen "" "Der Wert scheint aufgelegt zu sein ist" 516-777316 "- der Text in der ursprünglichen Excel-Tabelle ist" 516-7773167 "(mit einer 7 am Ende) "" "--- es ist schwer vorstellbar, wie die 7 am Ende verloren geht. Ich würde so etwas wie diese benutze, um genau herauszufinden, was die problematischen Daten waren:
try:
str_value = str(s.cell_value(row, col))
except:
print "row=%d col=%d cell_value=%r" % (row, col, s.cell_value(row, col))
raise
Das% r erspart Sie die Eingabe eines ... cell_value=%s ... repr(s.cell_value(row, col))
die repr() eine eindeutige Darstellung der Daten erzeugt. Lern es. Benutze es.
Wie sind Sie zu "516-777316" gekommen?
DRITTER Weise beschwert sich die Fehlermeldung tatsächlich über ein Unicode-Zeichen u '\ xed' bei Offset 5 (d. H. Das sechste Zeichen). U + 00ED ist LATIN KLEINER BUCHSTABE I MIT AKUTE, und es gibt nichts dergleichen in "516-7773167"
VIERTERS scheint der Fehlerort ein bewegliches Ziel zu sein - Sie sagten in einem Kommentar auf einem der Lösungen: "Der Fehler ist auf bcw.writerow." Hä?
(D) Warum haben Sie diese Fehlermeldung (mit str()): str(a_unicode_object)
versucht, das Unicode-Objekt in ein Str-Objekt zu konvertieren, und in Ermangelung jeglicher Codierungsinformationen verwendet ascii, aber Sie haben nicht-ASCII-Daten, so splat. Beachten Sie, dass Ihr Objekt eine csv-Datei erzeugt, die in utf8 codiert ist, aber Ihr vereinfachtes Skript utf8 nirgends erwähnt.
(E) "" "... an Zelle (Zeile, Spalte)) (zB Zelle statt s.cell_value)
das gesamte Dokument schreibt ohne Fehler. Die Ausgabe ist nicht besonders wünschenswert (Text: u'516-7773167 ‚)‚‘“
das geschieht, weil der csv Schreiber ist die __str__
Methode der Cell-Objekt aufrufen, und dies erzeugt <type>:<repr(value)>
, die für die Fehlersuche nützlich sein können, aber wie Sie sagen, nicht so groß in der cSV-Datei.
(F) Die Lösung von Alex Martelli ist großartig, weil es Sie in Gang gebracht hat, aber Sie sollten den Abschnitt über die Cell-Klasse in den xlrd-Dokumenten lesen: Zellentypen sind Text, Zahl, Boolesch, Datum, Fehler, leer und leer yo Da Sie Daten haben, möchten Sie sie als Datumsangaben formatieren und nicht als Zahlen, so dass Sie isinstance() nicht verwenden können (und den Funktionsaufruf sowieso nicht wollen). Dies ist das Attribut Cell.ctype
und Sheet.cell_type()
und Sheet.row_types()
Methoden sind für.
(G) UTF8 ist kein Unicode. UTF16LE ist kein Unicode. UTF16 ist kein Unicode ... und die Idee, dass einzelne Strings 2 Bytes pro UTF16 BOM verschwenden, ist zu grotesk, um selbst MS zu betrachten :-)
(H) Weiterführende Literatur (abgesehen von den xlrd docs):
http://www.joelonsoftware.com/articles/Unicode.html
http://www.amk.ca/python/howto/unicode
Es wäre nützlich, den gesamten Traceback zu sehen, um zu wissen, wer den Fehler wirft. – Christopher
Nicht viel mehr zu sehen: Datei "the_script.py ", Zeile 40, in this_row.append (str (s.cell_value (row, col))) UnicodeEncodeError: 'ascii' Codec kann das Zeichen nicht in Position 5 'codieren': Ordnungszahl nicht im Bereich (128) –
anschauung
Mit "Ausgabe von Excel in Unicode" scheinst du "Ausgabe von Excel in UTF-16" zu bedeuten. Unicode definiert einen Codespace, der durch die verschiedenen Kodierungssysteme, wie UTF-8 oder UTF-16 dargestellt wird. – Svante