python os.rename(...) 不起作用!

1 投票
6 回答
29917 浏览
提问于 2025-04-16 06:51

我正在写一个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

我能在变量level里成功得到带有新后缀的文件名,正如你在打印输出中看到的那样,但实际上并没有成功,因为我无法在操作系统层面完成这个过程。错误是出现在os.rename(...)这行。有没有什么办法可以解决这个问题?

6 个回答

2

在Python字符串中,如果你想使用反斜杠(\),需要把它们写成两个反斜杠(\\),这样才能正确显示。所以,不是这样写:

file_list = os.listdir('C:\Users\B\Desktop\sil\sil2')

而是这样:

file_list = os.listdir('C:\\Users\\B\\Desktop\\sil\\sil2')

另外,你也可以使用正斜杠(/)——在Windows系统上,Python会神奇地把它当作路径分隔符来处理。

3

os.rename 这个函数对变量的使用不是很友好。建议使用 shutil 模块。这个例子来自于 如何使用 Shutil 复制和移动文件

import shutil
import os
source = os.listdir("/tmp/")
destination = "/tmp/newfolder/"
for files in source:
    if files.endswith(".txt"):
        shutil.move(files,destination)

在你的情况下:

import shutil
shutil.move(file_list[entry_pos], new_file_name)
9
  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', '...')

撰写回答