3

Python 2.5 でパスに特殊文字 (日本語の文字、キリル文字) を含むファイルをコピーする方法はありますか? shutil.copyこれを処理できません。

ここにいくつかのサンプルコードがあります:

import copy, os,shutil,sys
fname=os.getenv("USERPROFILE")+"\\Desktop\\testfile.txt"
print fname
print "type of fname: "+str(type(fname))
fname0 = unicode(fname,'mbcs')
print fname0
print "type of fname0: "+str(type(fname0))
fname1 = unicodedata.normalize('NFKD', fname0).encode('cp1251','replace')
print fname1
print "type of fname1: "+str(type(fname1))
fname2 = unicode(fname,'mbcs').encode(sys.stdout.encoding)
print fname2
print "type of fname2: "+str(type(fname2))

shutil.copy(fname2,'C:\\')

ロシアの Windows XP での出力

C:\Documents and Settings\└фьшэшёЄЁрЄюЁ\Desktop\testfile.txt
type of fname: <type 'str'>
C:\Documents and Settings\Администратор\Desktop\testfile.txt
type of fname0: <type 'unicode'>
C:\Documents and Settings\└фьшэшёЄЁрЄюЁ\Desktop\testfile.txt
type of fname1: <type 'str'>
C:\Documents and Settings\Администратор\Desktop\testfile.txt
type of fname2: <type 'str'>
Traceback (most recent call last):
  File "C:\Test\getuserdir.py", line 23, in <module>
    shutil.copy(fname2,'C:\\')
  File "C:\Python25\lib\shutil.py", line 80, in copy
    copyfile(src, dst)
  File "C:\Python25\lib\shutil.py", line 46, in copyfile
    fsrc = open(src, 'rb')
IOError: [Errno 2] No such file or directory: 'C:\\Documents and Settings\\\x80\
xa4\xac\xa8\xad\xa8\xe1\xe2\xe0\xa0\xe2\xae\xe0\\Desktop\\testfile.txt'
4

3 に答える 3

2

Unicode引数をに渡してみてくださいshutil.copy()。あれは、shutil.copy( fname0, u'c:\\')

http://docs.python.org/howto/unicode.html#unicode-filenames

http://www.amk.ca/python/howto/unicode#unicode-filenames

http://www.python.org/dev/peps/pep-0277/

于 2010-05-27T08:15:39.780 に答える
0

回避策として、os.chdirUnicodeという名前のディレクトリにshutil移動して、Unicode引数を指定する必要がないようにすることができます(ファイル名に非ASCIIが含まれている場合は、明らかに役に立ちません)。

os.chdir(os.getenv("USERPROFILE")+"\\Desktop\\")
shutil.copy("testfile.txt",'C:\\')

または、昔ながらの方法でファイルをコピーすることもできます。

in_file = open(os.getenv("USERPROFILE")+"\\Desktop\\testfile.txt", "rb")
out_file = open("C:\testfile.txt", "wb")
out_file.write(in_file.read())
in_file.close()
out_file.close()

私が考えることができる3番目の回避策は、代わりにPython3を使用することです:)

于 2010-05-27T08:48:15.737 に答える
0

問題を解決しました

Windows XP のデスクトップ パスは、「C:\Documents and Settings\Администратор\Desktop」ではありません。「C:\Documents and Settings\Администратор\Рабочий стол」です。そして今、両方の間にマッピングがあります。

Windows Vista 以降、このパスは C:\users\Администратор\Desktop で呼び出すことができますが、エクスプローラーでは「C:\Пользователь\Администратор\Рабочий стол」と呼ばれます。

于 2010-05-27T12:31:03.387 に答える