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

时间:2009-05-10 19:22:10

标签: python unicode windows-xp

我的问题类似于Python's os.path choking on Hebrew filenames

但是,我不知道我需要重命名的文件名的原始编码(与他知道最初是希伯来语的其他帖子不同)。

我正在为客户端进行数据恢复,并将文件复制到我的XP SP3机器上, 一些文件名有“?”替换/代表无效字符。

我尝试使用Python来os.rename文件,因为我知道它有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

我在Win XP SP3上使用Python 2.6,无论编码是美国/英国的标准XP行为。

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

2 个答案:

答案 0 :(得分: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)) 

答案 1 :(得分:0)

尝试传递unicode字符串:

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