Próbuję utworzyć plik tekstowy w formacie csv z PyQt4 QTableWidget
. Chcę napisać tekst z kodowaniem UTF-8, ponieważ zawiera znaki specjalne. Używam następującego kodu:
import codecs
...
myfile = codecs.open(filename, 'w','utf-8')
...
f = result.table.item(i,c).text()
myfile.write(f+";")
Działa, dopóki komórka nie zawiera znaku specjalnego. Próbowałem też z
myfile = open(filename, 'w')
...
f = unicode(result.table.item(i,c).text(), "utf-8")
Ale zatrzymuje się również, gdy pojawia się znak specjalny. Nie mam pojęcia, co robię źle.
myfile.write(u"%s"&f+";")
Odpowiedzi:
Z twojego biegu powłoki:
I (w przeciwieństwie do pierwotnego pytania) zakładając, że używasz wbudowanego
csv
modułu Pythona , zamieńimport csv
goimport unicodecsv as csv
w swój kod.źródło
writer = csv.writer(out, dialect='excel', encoding='utf-8')
i utworzyć procedurę obsługi pliku za pomocąopen(...
, niecodecs.open(...
.To bardzo proste w przypadku Pythona 3.x ( dokumentacja ).
import csv with open('output_file_name', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.writer(csv_file, delimiter=';') writer.writerow('my_utf8_string')
W przypadku Pythona 2.x zajrzyj tutaj .
źródło
writerow
nie jest utf-8? czy to zadziała?Użyj tego pakietu, po prostu działa: https://github.com/jdunck/python-unicodecsv .
źródło
Dla mnie
UnicodeWriter
klasa z dokumentacji modułu Python 2 CSV tak naprawdę nie działała, ponieważ psujecsv.writer.write_row()
interfejs.Na przykład:
csv_writer = csv.writer(csv_file) row = ['The meaning', 42] csv_writer.writerow(row)
działa, podczas gdy:
csv_writer = UnicodeWriter(csv_file) row = ['The meaning', 42] csv_writer.writerow(row)
rzuci
AttributeError: 'int' object has no attribute 'encode'
.Ponieważ
UnicodeWriter
oczywiście oczekujemy, że wszystkie wartości kolumn będą ciągami, możemy sami przekonwertować wartości i po prostu użyć domyślnego modułu CSV:def to_utf8(lst): return [unicode(elem).encode('utf-8') for elem in lst] ... csv_writer.writerow(to_utf8(row))
Lub możemy nawet małpować csv_writer, aby dodać
write_utf8_row
funkcję - ćwiczenie pozostawia się czytelnikowi.źródło
Przykłady w dokumentacji Pythona pokazują, jak pisać pliki CSV Unicode: http://docs.python.org/2/library/csv.html#examples
(nie można tutaj skopiować kodu, ponieważ jest chroniony prawem autorskim)
źródło
W przypadku python2 możesz użyć tego kodu, zanim
csv_writer.writerows(rows)
ten kod NIE skonwertuje liczb całkowitych na łańcuchy utf-8
źródło
Bardzo prostym hackem jest użycie importu json zamiast csv. Na przykład zamiast csv.writer wykonaj następujące czynności:
fd = codecs.open(tempfilename, 'wb', 'utf-8') for c in whatever : fd.write( json.dumps(c) [1:-1] ) # json dumps writes ["a",..] fd.write('\n') fd.close()
Zasadniczo, biorąc pod uwagę listę pól w prawidłowej kolejności, sformatowany łańcuch json jest identyczny z wierszem csv, z wyjątkiem [i] odpowiednio na początku i na końcu. Wydaje się, że json jest odporny na utf-8 w Pythonie 2. *
źródło