7

WindowsのPythonスクリプトで、Unicodeという名前のファイルをUnicodeという名前のフォルダー間で移動するのに苦労しています...

フォルダー内のタイプ *.ext のすべてのファイルを検索し、それらを相対位置に移動するには、どの構文を使用しますか?

ファイルとフォルダーはユニコードであると仮定します。

4

2 に答える 2

15

基本的な問題は、Unicode とバイト文字列が変換されずに混在していることです。解決策は、単一の形式に変換するか、いくつかのトリックを使用して問題を回避することです。私のすべてのソリューションにはglobshutil標準ライブラリが含まれています。

例として、 で終わる Unicode ファイル名がいくつかあり、それらを(Unicode 文字であるヘブライ語 Aleph)odsという名前のサブディレクトリに移動したいと考えています。א

最初の解決策 - ディレクトリ名をバイト文字列として表現する:

>>> import glob
>>> import shutil
>>> files=glob.glob('*.ods')      # List of Byte string file names
>>> for file in files:
...     shutil.copy2(file, 'א')   # Byte string directory name
... 

2 番目の解決策 - ファイル名を Unicode に変換します。

>>> import glob
>>> import shutil
>>> files=glob.glob(u'*.ods')     # List of Unicode file names
>>> for file in files:
...     shutil.copy2(file, u'א')  # Unicode directory name

Python バグ リストの Ezio Melotti の功績によるものです。

3 番目の解決策 - 宛先の Unicode ディレクトリ名を避ける

これは私の意見では最善の解決策ではありませんが、言及する価値のある素晴らしいトリックがあります。

を使用してディレクトリを宛先ディレクトリに変更し、os.getcwd()次のように参照してファイルをコピーします.

# -*- coding: utf-8 -*-
import os
import shutil
import glob

os.chdir('א')                   # CD to the destination Unicode directory
print os.getcwd()               # DEBUG: Make sure you're in the right place
files=glob.glob('../*.ods')     # List of Byte string file names
for file in files:
        shutil.copy2(file, '.') # Copy each file
# Don't forget to go back to the original directory here, if it matters

より深い説明

Unicode と ASCII 文字列を変換せずに連結するため、単純なアプローチshutil.copy2(src, dest)は失敗します。shutil

>>> files=glob.glob('*.ods')
>>> for file in files:
...     shutil.copy2(file, u'א')
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/usr/lib/python2.6/shutil.py", line 98, in copy2
    dst = os.path.join(dst, os.path.basename(src))
  File "/usr/lib/python2.6/posixpath.py", line 70, in join
    path += '/' + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 1: 
                    ordinal not in range(128)

前に見たように、これ'א'は Unicode の代わりに使用すると回避できます。u'א'

これはバグですか?

私の意見では、これはバグです。なぜなら、Python はbasedir名前がstrではなく always であることを期待できないからですunicode。これをPython バグリスト の問題として報告し、応答を待っています。

参考文献

Python の公式 Unicode HOWTO

于 2011-04-02T13:18:27.277 に答える
3

どこでも Unicode 文字列を使用:

# -*- coding: utf-8 -*-
# source code ^^ encoding; it might be different from sys.getfilesystemencoding()
import glob
import os

srcdir = u'مصدر الدليل' # <-- unicode string
dstdir = os.path.join('..', u'κατάλογο προορισμού') # relative path
for path in glob.glob(os.path.join(srcdir, u'*.ext')):
    newpath = os.path.join(dstdir, os.path.basename(path))
    os.rename(path, newpath) # move file or directory; assume the same filesystem

ファイルの移動には多くの微妙な詳細があります。関数を参照してくださいshutit.copy*。特定のケースに適したものを使用し、成功するとソースファイルを削除できますos.remove()

于 2011-04-02T16:47:51.013 に答える