Переименовать неверное имя файла в XP через Python - PullRequest
4 голосов
/ 10 мая 2009

Моя проблема похожа на os.path Python, заглушающий имена файлов на иврите

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

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

Я пытался использовать Python для os.rename файлов, поскольку я знаю, что он поддерживает юникод, однако, когда я говорю python о переименовании файлов, кажется, что он не может передать действительное имя файла обратно в Windows 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 / US.

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

Ответы [ 2 ]

2 голосов
/ 11 мая 2009

'?' не является допустимым символом для имен файлов. Вот почему ваш подход не удался. Вы можете попробовать использовать короткие имена файлов 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)) 
0 голосов
/ 11 мая 2009

Попробуйте передать строку Unicode:

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