2015-04-27 5 views
0

Я следующий код в Pyhton:Unicode (UTF-8) не может быть отображен правильно? (Python)

# myFile.csv tend to looks like: 
# 'a1', 'ふじさん', 'c1' 
# 'a2', 'ふじさん', 'c2' 
# 'a3', 'ふじさん', 'c3' 

s = u"unicodeText" # unicodeText like, ふじさん بعدة أش 일본富士山Ölkələr 
with codecs.open('myFile.csv', 'w+', 'utf-8') as f: # codecs open 
    f.write(s.encode('utf-8', 'ignore')) 
  1. я использую Vim для редактирования кода и с помощью Vim, чтобы открыть "myFile.csv";
  2. Успешно отображает текст в формате unicode с терминала;
  3. , но не может отображать текст в формате Unicode из Excel или из браузера;
  4. Моя платформа OSX

Я не знаю, если это моя проблема конфигурации или на самом деле я код это неправильный путь, если вы какие-либо идеи, пожалуйста, сообщите. Глубоко ценим!


изменение open к codecs.open.
Спасибо за указание f.close(), удалено.

+2

не то, что SomeString? –

+0

Нет смысла читать/записывать файлы 'xls' или' csv' так, как вы пытаетесь это сделать. Вам необходимо использовать специализированный модуль, например [xlrd] (http://pypi.python.org/pypi/xlrd) для файлов 'xls', или [csv module] (https://docs.python.org /3/library/csv.html#module-csv) для файлов 'csv'. – ekhumoro

+0

@ekhumoro вы правы насчет 'xls', но для записи файла' csv' не требуется специальный модуль. – dbliss

ответ

1

codecs.open открывает обернутый читатель/писатель, который будет кодировать/расшифровывать для вас. Поэтому вам не нужно кодировать строку для записи. Вы должны передать параметр «игнорировать» в своем открытом вызове.

with open('myFile.csv', 'w+', 'utf-8', 'ignore') as f: 
    f.write(s) 

Обратите внимание, что вам не нужно звонить близко, как вы используете с заявлением.

Оригинальный ответ, поцарапать, что:

Третий параметр открытой является буферизация требует целое. Вы должны написать пройти кодировку, как это:

with open('myFile.xls', 'w+', encoding='utf-8') as f: 

Обратите внимание, что при открытии файла в текстовом режиме. Нет необходимости кодировать строку для записи.

Также ваш файловый режим 'w +' немного нечетный. Я не уверен, но я думаю, что это урезает ваш файл. Если вы хотите добавить в файл, вы должны использовать режим «a».

+0

OP, похоже, использует ['codecs.open'] (https://docs.python.org/3/library/codecs.html#codecs.open), который имеет другую подпись для встроенной функции 'open'. – ekhumoro

+0

Ooops. Моя вина. Не заметил комментариев, только пытался заставить код работать. – mkiever

+0

Исправил ответ, но оставил первую попытку для согласованности внизу. – mkiever

1

Кажется, вы используете , пытаясь, чтобы открыть файл в текстовом режиме (потому что вы указали кодировку), но затем вы пытаетесь записать двоичные данные (потому что вы кодируете текст перед записью его в файл). Вам нужно либо открыть файл как двоичный, либо написать закодированный текст, либо открыть его как текст и написать текст.

Кроме того, ваша попытка открыть его как текст даже не работает, потому что вы передаете utf-8 в качестве параметра буферизации вместо параметра encoding. См. the open() documentation `.

Но даже если вы все сделали правильно, это все равно не поможет вам с файлом Excel, потому что у них сложная двоичная структура. Я рекомендую вам использовать что-то вроде xlrd для чтения файлов xls и Xlswriter, чтобы написать их.

Вот простой пример, который должен работать.CSV:

with open('file.csv', 'w', encoding='utf-8') as fh: 
    fh.write('This >µ< is a unicode GREEK LETTER MU\n') 

или альтернативно

with open('file.csv', 'wb') as fh: 
    fh.write('This >µ< is a unicode GREEK LETTER MU\n'.encode('utf-8')) 
+0

Спасибо! Я думаю, что codecs.open действительно может передавать параметр как «uft-8», и вы правы, io.open должен передавать параметр как encoding = 'utf-8'. – user3284318

+0

Как насчет принятия этого ответа? :-) – Nikratio

1

Excel (по крайней мере на Windows) любит Unicode BOM в начале файла .csv даже с UTF-8. Для этого есть кодек, utf-8-sig.

Кроме того, Python 3 нормаль open это все, что требуется, и нет необходимости в f.close() в with:

#coding:utf8 
data = '''\ 
a1,ふじさん,c1 
a2,ふじさん,c2 
a3,ふじさん,c3 
''' 
with open('myFile.csv', 'w', encoding='utf-8-sig') as f: 
    f.write(data) 
+0

'utf-8-sig' работает. Спасибо за внимание. удален 'f.close()', thx так много – user3284318

Смежные вопросы