通过Python重命名XP中无效的文件名

4
我的问题与Python的os.path无法处理希伯来文件名类似,但我不知道需要重命名的文件的原始编码(不像其他帖子,他知道原本是希伯来语)。我为客户进行数据恢复并将文件复制到我的XP SP3机器上,一些文件名用“?”替换/表示无效字符。我试图使用Python的os.rename重命名文件,因为我知道它支持unicode,但当我告诉Python重命名文件时,似乎无法向Windows API传递有效的文件名。

i.e.:

>>> 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 /英语编码。

是否有一种处理这些重命名的方法,而不知道原始语言?


1
你说 blah[0] 的 repr 正好是 Don't Be Them.mp3(不包括反引号),我认为你并没有复制粘贴,而是即兴发挥。 - tzot
两个文件系统都是NTFS吗?你是不是复制到了本地的FAT32卷?你是将失败的磁盘连接到本地,还是通过网络/CIFS复制的? - tzot
2个回答

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)) 

0

尝试传递一个Unicode字符串:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接