2012-04-16 10 views
8

Nie wydaje mi się, żebym mógł otworzyć plik, który ma nazwę pliku Unicode. Powiedzmy zrobić:otworzyć plik z nazwą pliku Unicode?

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

Kiedy próbuję szukać jakiegoś rozwiązania, zawsze dotrzesz strony o tym, jak czytać i pisać ciąg Unicode do pliku, a nie jak otworzyć plik z file() lub open() który ma nazwa unicode.

+2

Kod Państwo napisali to w jaki sposób to zrobić. Co jest z tym nie tak? – kindall

+0

Tak, a co z tym kodem nie działa? – agf

Odpowiedz

27

Wystarczy przejść open() ciąg Unicode dla nazwy pliku:

w Pythonie 2.x:

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

w Pythonie 3.x, wszystkie ciągi są Unicode, więc nie ma dosłownie nic do niego .

Jak zawsze należy pamiętać, że najlepszym sposobem otwierania pliku zawsze jest użycie with statement w połączeniu z open().

Edit: W odniesieniu do os.listdir() rada ponownie zmienia się pod Pythona 2.x, trzeba być ostrożnym:

os.listdir(), która zwraca nazwy plików, podnosi kwestię: Powinno powrót wersja nazw plików w standardzie Unicode, czy powinna zwracać 8-bitowe łańcuchy zawierające zakodowane wersje? os.listdir() zrobi oba, w zależności od tego, czy podałeś ścieżkę do katalogu jako 8-bitowy ciąg znaków czy ciąg znaków Unicode. Jeśli jako ścieżkę zostanie przekazany ciąg znaków Unicode, nazwy plików zostaną zdekodowane przy użyciu kodowania systemu plików, a lista ciągów znaków Unicode zostanie zwrócona, natomiast podanie 8-bitowej ścieżki zwróci 8-bitowe wersje nazw plików.

Source

Tak w skrócie, jeśli chcesz Unicode, umieścić w Unicode:

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

Zauważ, że plik będzie nadal otwarte w obu kierunkach - nie będzie reprezentował dobrze w Python, ponieważ będzie to ciąg 8-bitowy, ale nadal będzie działał.

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

Pod 3.x, jak zawsze, zawsze jest to kod Unicode.

+1

Co się stanie, jeśli użyję czegoś w rodzaju 'os.listdir()', nie tworząc sam napisów unicode? –

+0

Wyobrażam sobie, że jeśli masz system plików obsługujący Unicode, os.listdir() zwróci ciągi znaków Unicode. –

+1

@ user975135 Edytowane, aby dodać notatkę o Python 2.x i '' os.listdir() '' z Unicode. –

7

Można spróbować to:

import os 
import sys 

for filename in os.listdir(u"/your-direcory-path/"): 
    open(filename.encode(sys.getfilesystemencoding()), "r") 
Powiązane problemy