Skip to main content
 首页 » 编程设计

python os.rename(...) 不会工作!

2025年05月04日11myhome

我正在编写一个 Python 函数来将文件列表的扩展名更改为另一个扩展名,例如将 txt 更改为 rar,这只是一个闲置示例。但我收到一个错误。代码是:

import os 
def dTask(): 
    #Get a file name list 
    file_list = os.listdir('C:\Users\B\Desktop\sil\sil2') 
    #Change the extensions 
    for file_name in file_list: 
        entry_pos = 0; 
        #Filter the file name first for '.' 
        for position in range(0, len(file_name)): 
            if file_name[position] == '.': 
                break 
        new_file_name = file_name[0:position] 
        #Filtering done ! 
        #Using the name filtered, add extension to that name 
        new_file_name = new_file_name + '.rar' 
        #rename the entry in the file list, using new file name 
        print 'Expected change from: ', file_list[entry_pos] 
        print 'into File name: ', new_file_name 
        os.rename(file_list[entry_pos], new_file_name) 
        ++entry_pos 
Error: 
>>> dTask() 
Expected change from:  New Text Document (2).txt 
into File name:  New Text Document (2).rar 
Traceback (most recent call last): 
  File "<pyshell#10>", line 1, in <module> 
    dTask() 
  File "C:\Users\B\Desktop\dTask.py", line 19, in dTask 
    os.rename(file_list[entry_pos], new_file_name) 
WindowsError: [Error 2] The system cannot find the file specified 

正如您在打印输出中看到的那样,我可以在变量级别成功获取具有另一个扩展名的文件名,但实际上不是,因为我无法在操作系统级别结束此过程。错误来自 os.rename(...)。知道如何解决这个问题吗?

请您参考如下方法:

  1. 正如其他人已经指出的那样,您需要提供这些文件的路径或切换当前工作目录以便操作系统可以找到这些文件。

  2. ++entry_pos 什么都不做。 Python 中没有增量运算符。前缀+ 正好与前缀- 对称。用两个 + 作为前缀只是两个空操作。所以您实际上没有做任何事情(并且在将其更改为 entry_pos += 1 之后,您仍然在每次迭代中将其重置为零。

  3. 此外,您的代码非常不优雅 - 例如,您对 file_list 使用了单独的索引,并且未能使它与迭代变量 file_name 保持同步>,即使你可以只使用那个!展示如何更好地做到这一点。

-

def rename_by_ext(to_ext, path): 
    if to_ext[0] != '.': 
        to_ext = '.'+to_ext 
    print "Renaming files in", path 
    for file_name in os.listdir(path): 
        root, ext = os.path.splitext(file_name) 
        print "Renaming", file_name, "to", root+ext 
        os.rename(os.path.join(path, file_name), os.path.join(path, root+to_ext)) 
rename_by_ext('.rar', '...')