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

4 投票
2 回答
2863 浏览
提问于 2025-04-15 11:30

我的问题和Python在处理希伯来文件名时出错的情况有点像。

不过,我不知道我需要重命名的文件名的原始编码是什么(而且在那个帖子里,他知道原来是希伯来语)。

我在为一个客户做数据恢复,把文件复制到我的XP SP3电脑上,结果有些文件名里的字符被替换成了“?”来表示无效字符。

我试着用Python的os.rename来重命名这些文件,因为我知道Python支持unicode(即支持多种语言的字符)。但是,当我让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对美国/英语的标准处理方式。

有没有办法在不知道原始语言的情况下处理这些重命名呢?

2 个回答

0

试着传递一个Unicode字符串:

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

撰写回答