2012-04-16 4 views
8

Кажется, я не могу открыть файл с именем файла unicode. Давайте скажем, я:открыть файл с именем файла unicode?

for i in os.listdir(): 
    open(i, 'r') 

Когда я пытаюсь найти какое-то решение, я всегда получаю страницы о том, как читать и писать строки Юникода в файл, а не как открыть файл с file() или open(), который имеет имя юникода.

+2

Код, который вы выложили, как я бы это сделать. Что с этим не так? – kindall

+0

Да, а как насчет этого кода не работает? – agf

ответ

27

Просто передайте open() Юникода строку для имени файла:

В Python 2.x:

>>> open(u'someUnicodeFilenameλ') 
<open file u'someUnicodeFilename\u03bb', mode 'r' at 0x7f1b97e70780> 

В Python 3.x, все строки Unicode, так что нет буквально ничего к нему ,

Как всегда, обратите внимание, что лучший способ открыть файл - всегда использовать with statement совместно с open().

Edit: Что касается os.listdir() совет снова изменяется под Python 2.x, вы должны быть осторожны:

os.listdir(), которая возвращает имена файлов, поднимает вопрос: должен ли он возвращение версию файлов в формате Unicode, или она должна возвращать 8-битные строки, содержащие кодированные версии? os.listdir() будет выполнять оба варианта, в зависимости от того, был ли указан путь к каталогу в виде 8-битовой строки или строки Unicode. Если вы передадите строку Unicode в качестве пути, имена файлов будут декодированы с использованием кодировки файловой системы, и список строк Unicode будет возвращен, а передача 8-битного пути вернет 8-битные версии имен файлов.

Source

Короче говоря, если вы хотите Unicode из, поставить Unicode в:

>>> os.listdir(".") 
['someUnicodeFilename\xce\xbb', 'old', 'Dropbox', 'gdrb'] 
>>> os.listdir(u".") 
[u'someUnicodeFilename\u03bb', u'old', u'Dropbox', u'gdrb'] 

Обратите внимание, что файл будет по-прежнему открывать в любом случае - это не будет хорошо представлена ​​в Python, поскольку это будет 8-битная строка, но она все равно будет работать.

open('someUnicodeFilename\xce\xbb') 
<open file 'someUnicodeFilenameλ', mode 'r' at 0x7f1b97e70660> 

Под 3.x, как всегда, это всегда Юникод.

+1

Что делать, если я использую что-то вроде 'os.listdir()', не создавая сами строки юникода? –

+0

Я бы предположил, что если вы используете файловую систему Unicode, os.listdir() вернет строки Unicode. –

+1

@ user975135 Отредактировано для добавления заметки о Python 2.x и '' os.listdir() '' в Unicode. –

7

Вы можете попробовать это:

import os 
import sys 

for filename in os.listdir(u"/your-direcory-path/"): 
    open(filename.encode(sys.getfilesystemencoding()), "r") 
Смежные вопросы