Записать содержимое Unicode и имя файла Unicode в Windows - PullRequest
2 голосов
/ 08 июня 2011
#source file is encoded in utf8
import urllib2
import re

req = urllib2.urlopen('http://people.w3.org/rishida/scripts/samples/hungarian.html')
c = req.read()#.decode('utf-8')

p = r'title="This is Latin script \(Hungarian language\)">(.+)'
text = re.search(p, c).group(1)

name = text[:10]+'.txt'  #file name will have special chars in it

f = open(name, 'wb')
f.write(text)  #content of file will have special chars in it
f.close()   


x = raw_input('done')

Как вы можете видеть, скрипт выполняет несколько действий: - Считывает содержимое, для которого известно, что у него есть символы Юникода, с веб-страницы в переменную

(Исходный файл сохраняется в utf-8, ноэто не должно иметь значения, если только строки юникода фактически не определены в исходном коде ... Как вы можете видеть, строка юникода определяется динамически в переменную ... какая кодировка источника не должна иметь значения в этом сценарии)

  • Записывает файл с именем, содержащим символы Unicode
  • Также записывает содержимое Unicode в этот файл

Вот странное поведение, которое я получаю (Windows 7,Python 2.7): Когда я не использую функцию декодирования:

c = req.read()

ИМЯ файла будет выдаваться бессмысленно, но СОДЕРЖАНИЕ файла будет читабельным (то есть вы можете увидетьисправьте юникодные венгерские символы)

Тем не менее, когда я ИСПОЛЬЗУЮ функцию декодирования:

c = req.read().decode('utf-8')

НЕ ОШИБКА при открытии файла (действительно при его создании)с режимом 'w'), и полученное имя файла будет доступно для чтения, да, теперь оно показывает правильные символы Юникода.

Пока все хорошо, верно?Что ж, тогда ОШИБКА будет пытаться записать содержимое файла в кодировке Юникод:

    f.write(text)  #content of file will have special chars in it
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 8: ordinal not in range(128)

Видите ли, у меня не может быть торта и есть его тоже ... Либо я могу правильно написатьИМЯ файла или я могу правильно написать СОДЕРЖАНИЕ файла ..

Как я могу сделать оба?

Я также пытался написать файл с

f = codecs.open(name, encoding='utf-8', mode='wb')

Но это тоже ошибки ..

Ответы [ 2 ]

4 голосов
/ 09 июня 2011

Пока ответ winterTTR работает .. Я понял, что этот подход запутан. Скорее всего, все, что вам действительно нужно сделать, это кодировать данные, которые вы записываете в файл. Имя, которое вам не нужно кодировать, и имя, и содержимое будут «читабельными».

content = '\xunicode chars'.decode('utf-8')
f = open(content[:5]+'.txt', 'wb')
f.write(content.encode('utf-8'))
f.close()
4 голосов
/ 08 июня 2011

Единственная проблема для вас, кажется, просто «нечитаемое» имя файла из вашего исходного исходного файла.Это может решить вашу проблему:

f = open(name.decode('utf-8').encode( sys.getfilesystemencoding() ) , 'wb')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...