2009-05-10 3 views
4

Моя проблема похожа на Python's os.path choking on Hebrew filenamesПереименовать недопустимое имя файла в XP через Python

однако, я не знаю, оригинальную кодировку файла мне нужно переименовать (в отличии от другого поста он знал это был иврит изначально).

Я делал восстановление данных для клиента и копировал файлы на свою машину XP SP3, , а некоторые из имен файлов имеют «?» заменяя/представляя недопустимые символы.

Я пытался использовать Python для файлов os.rename, так как я знаю, что он поддерживает юникод, однако, когда я говорю python о переименовании файлов, кажется, что он не может передать действительное имя файла обратно в API окон.

т.е .:

>>> os.chdir(r'F:\recovery\My Music') 
>>> os.listdir(u'.') 
[u'Don?t Be Them.mp3', u'That?s A Soldier.mp3'] 
>>> blah=os.listdir(u'.') 
>>> blah[0] 
Don?t Be Them.mp3 
>>> os.rename(blah[0],'dont be them.mp3') 

Traceback (most recent call last): 
    File "<pyshell#6>", line 1, in <module> 
    os.rename(blah[0],'dont be them.mp3') 
WindowsError: [Error 123] The filename, directory name, or 
    volume label syntax is incorrect 

Я использую Python 2.6, на Win XP SP3, с тем, что кодирование является стандартным XP поведение для США/английский.

Есть ли способ справиться с этими переименованиями, не зная исходного языка?

+1

Вы говорите, что магнезии из бла [0] именно 'Дон т быть Them.mp3' (без обратных кавычек), и я говорю, вы не сделали? копировать-вставить, но импровизировать. – tzot

+0

Являются ли обе файловые системы NTFS? Может быть, вы копируете локальный том FAT32? Вы локально подключили неисправный диск или скопировали его по сети/CIFS? – tzot

ответ

0

Попробуйте пропускание юникода строки: '?'

os.rename(blah[0], u'dont be them.mp3') 
2

Недопустимый символ для имен файлов. Вот почему ваш подход не удался. Вы можете попробовать использовать DOS коротких имена файлов:

import win32api 
filelist = win32api.FindFiles(r'F:/recovery/My Music/*.*') 

# this will extract "short names" from WIN32_FIND_DATA structure 
filelist = [i[9] if i[9] else i[8] for i in filelist] 

# EXAMPLE:  
# this should rename all files in 'filelist' to 1.mp3, 2.mp3, 3.mp3, ... 
for (number, filename) in enumerate(filelist): 
    os.rename(filaname, '%d.mp3' % (number))