python os.rename(...) 不起作用!
我正在写一个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
正如其他人所说的,你需要提供那些文件的路径,或者改变当前的工作目录,这样操作系统才能找到这些文件。
++entry_pos
其实没什么用。在Python里没有自增运算符。前面的+
只是为了和前面的-
对称而已。用两个+
前缀其实就是两个无操作。所以你实际上没有做任何事情(而且即使你把它改成entry_pos += 1
,在每次循环中你还是把它重置为零)。另外,你的代码写得很不优雅——比如说,你用一个单独的索引来访问
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', '...')