2010-05-27 2 views
3

Есть ли способ в Python 2.5 скопировать файлы, имеющие специальные символы (японские символы, кириллические буквы) на своем пути? shutil.copy не может справиться с этим.Python: Копирование файлов со специальными символами в пути

вот несколько примеров кода:

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' 
+0

Что происходит на 'shutil.copy (fname," C: \\ ")'? Похоже, вы можете кодировать то, что не нужно кодировать. – msw

+0

вывод: IOError: [Errno 2] Нет такого файла или каталога: 'C: \\ Documents and Settings \\\ x80 \ xa4 \ xac \ xa8 \ xad \ xa8 \ xe1 \ xe2 \ xe0 \ xa0 \ xe2 \ xae \ xe0 \\ Desktop \\ testfile.txt ' – user351681

+0

В Ubuntu Linux 'shutil.copy (« Администратор/boo »,« Администратор/foo »)' работает без проблем в Python 2.6:/ – badp

ответ

2

Попробуйте передать аргументы Юникода в 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/

+0

Нет, это действительно работает. shutil.copy требует str аргументов и преобразует их. результат: IOError: [Errno 2] Нет такого файла или каталога: u'C: \\ Документы и настройки \\\ u0410 \ u0434 \ u043c \ u0438 \ u043d \ u0438 \ u0441 \ u0442 \ u0440 \ u0430 \ u0442 \ u0440 \ u0430 \ u0442 \ u043e \ u0440 \\ Desktop \\ testfile.txt ' – user351681

+0

Интересно. У меня нет оконной коробки. Было бы удобно для вас попробовать его с помощью python 2.6? Я знаю, что была какая-то работа в Unicode для этой версии, но я не знаю, повлияло ли это на вашу проблему. –

+0

Функции 'shutil' не изменяют своих аргументов, а функция' open' всегда использует строки Unicode для Windows. – Philipp

0

В качестве обходного пути, вы можете os.chdir к юникоду имени каталога, так что 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() 

Третий обходной путь я могу вспомнить, используя Python 3 вместо :)

0

решена проблема

Путь Desktop в Windows XP не является «C: \ Documents и Settings \ Администратор \ Рабочий стол». Это «C: \ Documents and Settings \ Администратор \ Рабочий стол». И теперь есть сопоставление между ними.

С Windows Vista вы можете позвонить по этому пути с помощью C: \ users \ Администратор \ Desktop, но он называется «C: \ Пользователь \ Администратор \ Рабочий стол» в Проводнике.