2017-11-12 3 views
0

私は、Windows上のいくつかのフォルダとファイルを管理するためにpython2を使用しています。python 2読み込みファイル名にWindowsが含まれていますか?

私のWindowsエンコーディングはGBKです。ほとんどのファイルでpath.decode('gbk')が問題ありません。

例コード:

from __future__ import unicode_literals, absolute_import 

from pathlib2 import Path 
from six import text_type, binary_type 

def text(string, encodings=['utf8', 'gbk']): 
    if isinstance(string, text_type): 
     return string 
    elif isinstance(string, binary_type): 
     for encoding in encodings: 
      try: 
       return string.decode(encoding) 
      except UnicodeDecodeError: 
       pass 
     else: 
      raise Exception('Can not decode with %s' % encodings) 

    else: 
     return text_type(string) 


root = Path('./data') 
for x in root.iterdir(): 
    if x.is_dir(): 
     print text(x.parts[1]) 

ではなく、いくつかのファイル名のために働く:このようなこのラインif x.is_dir()で、が含まれているとして

は、エラーにDIRチェックアウト

File "e:\Workspace\PixivUtil2\StorageManager.py", line 50, in __init__ 
    self.refresh() 
    File "e:\Workspace\PixivUtil2\StorageManager.py", line 90, in refresh 
    if x.is_dir(): 
    File "D:\Python27\lib\site-packages\pathlib2.py", line 1463, in is_dir 
    return S_ISDIR(self.stat().st_mode) 
    File "D:\Python27\lib\site-packages\pathlib2.py", line 1257, in stat 
    return self._accessor.stat(self) 
    File "D:\Python27\lib\site-packages\pathlib2.py", line 481, in wrapped 
    return strfunc(str(pathobj), *args) 
WindowsError: [Error 123] : 'data\\464063 - ?3' 

コメントをスローします直接ファイルを書くには

[Errno 22] invalid mode ('wb') or filename: u'data\\464063 - ?3\\11111111.txt' 

は、GBKには含まれていないので、?と表示されるため、Windowsのcmdでは表示できません。

しかし、この問題を正しく処理する方法は?私はフォルダ名を読んでその下にファイルを作成したい。それが問題のように見える

+0

Python 3にアップグレードするか、パスに頼らずに手動で作業する必要があります。 –

+0

@Burhan Khalid私が依存しているlibはpython2のみです。python3に変換するのは難しいので、タイトルでpython 2を強調しています。 – Mithril

答えて

1

は、少なくともPythonの2.xの上pathlib2である:

>>> from pathlib2 import Path 
>>> root = Path(u'.') 
>>> for f in root.iterdir(): 
... print f 
... 
???.txt 

通常は、Unicodeのパスを使用している場合、あなたはUnicodeのファイル名を取得:

>>> import glob 
>>> glob.glob('*.txt') 
['???.txt'] 
>>> glob.glob(u'*.txt') 
[u'\u9a6c\u514b\u2663.txt'] # u'马克♣.txt' 

私が使用することをお勧めos.listdir():本当に

>>> import os 
>>> for f in os.listdir(u'.'): 
... print repr(f) # to avoid UnicodeEncodeError... 
... 
u'\u9a6c\u514b\u2663.txt' 
>>> 

、Pythonの3.6に切り替える:

>>> import os 
>>> os.listdir('.') 
['马克♣.txt'] 
+0

あなたは正しいですが、 'pathlib'だけがこのような問題を抱えています。私はそれだけで 'os'と' os.path'を高レベルにパッケージ化しますが、 'os.listdir'を試しませんでした。 – Mithril

関連する問題