2016-02-13 1 views
1

Я получаю имена файлов с диска, и мне было интересно, есть ли способ справиться с такой строкой unicode, которая могла бы работать одновременно.Есть ли способ совместной работы с юникодами в Python 2 и 3 одновременно?

В принципе, в Python2 мне нужно будет установить правильный декодер для строки, а в Python3 мне нужно будет сначала его закодировать, поскольку в Python3 нет метода декодирования для строки.

Мой обходной путь до сих пор включить такой код:

if sys.version_info[0] > 2: 
    name = name.encode('utf-8') 
name.decode('utf-8') 

, но мы надеемся, является экологически чистым способом решить эту

+1

см это обсуждение: http://python-future.org/unicode_literals.html – matth

ответ

1

Это работает то же самое в Python 2 и Python 3. Использование Unicode строки для os.listdir вернут имена файлов Unicode. os.walk работает аналогичным образом. Если вы не хотите переключаться на unicode_literals, используйте вместо этого u'.'.

from __future__ import unicode_literals,print_function 
import os 

for filename in os.listdir('.'): 
    print(filename) 
+0

по некоторым причинам, когда у меня есть 'от __future__ импорта unicode_literals' линии, я переживаю этот вопрос и интерпретатор выдает' UnicodeDecodeError: кодек 'ascii' не может декодировать байты ... ', и если у меня его нет, кажется, что это работает, но пока я не могу воспроизвести ошибку в маленьком sniplet кода, в то время как в более крупных программах, похоже, быть хорошо воспроизводимым, например [здесь] (https://bitbucket.org/norok2/hdu/src/397c743766acd415df1173781538f9cd725e8460/hdu/hdu.py?at=master&fileviewer=file-view-default) – norok2

+0

Ваша большая программа не была написана для обработки всех строк как Unicode , так что вы не сможете отказаться от него, не принимая во внимание его. Где-то, используя 'unicode_literals', вы вызываете то, что ожидает байтов, а Python 2 неявно преобразует его с помощью кодека' ascii'. Находясь в Linux, вы можете оставить все пути и имена файлов байтами, просто потому, что ваш скрипт потерпит неудачу, если он найдет имена файлов, не закодированные в UTF-8. В Windows файловая система NTFS является изначально UTF-16, поэтому рассмотрение их всех как Unicode имеет смысл. –

+0

Я также думал, что, но я не могу отследить, где именно это происходит. Я считаю, что в тот момент, когда это терпит неудачу, я использовал только 'os.listdir',' os.path.join', 'os.path.basename' и' str.startswith', и ни один из них, ни один, ни один комбинация, воспроизводит проблему. С другой стороны, я использую рекурсивный вызов функции в какой-то момент, и мне было интересно, может ли это быть связано с этим. – norok2