这个重命名文件的Python代码有什么问题?
这段代码的目的是让你选择一个文件夹,然后列出那个文件夹里的所有文件,接着把这些文件重命名为它们在列表中的位置。不过,我总是遇到错误2,意思是找不到文件。奇怪的是,当我打印出文件列表时,它确实能找到文件,因为列表不是空的。
import os, sys
path = input("input path: ")
dirs = os.listdir(path)
for i in range(0,len(dirs)):
os.rename(dirs[i], str(i))
给定一些输入文件,我想把文件的基本名称改成一个数字,但要保留文件的扩展名。也就是说,
输入 'a.txt', 'test.txt', 'test1.txt'
输出 '0.txt', '1.txt', '2.txt'
1 个回答
5
没错,你确实需要加上我评论里的代码。问题在于 os.listdir 只返回文件的基本名称,所以当你调用重命名时,它会期望在 Python 认为应该在的目录中找到这些文件。通过添加 os.path.join,它会构建出文件的完整路径,这样重命名就能正确工作了。
在评论中,提问者提到文件被移动到上一级文件夹,这让我觉得重命名的第二个参数需要一个完整的路径。此外,我们还了解到文件不应该从 foo.txt 重命名为 0,而是应该变成 0.txt 等等(保留文件扩展名)。现在这段代码
import os, sys
path = input("input path: ")
dirs = os.listdir(path)
for i in range(0,len(dirs)):
# capture the fully qualified path for the original file
original_file = os.path.join(path, dirs[i])
# Build the new file name as number . file extension
# if there is no . in the file name, this code goes boom
new_file = os.path.join(path, str(i) + '.' + original_file.split('.')[-1])
print "Renaming {0} as {1}".format(original_file, new_file)
os.rename(original_file, new_file)
在 Python 2.6.1 中验证过了。
这里展示了命令行中的相关部分。你可以看到空文件 bar.txt 和 foo.txt 被重命名为 0 和 1。
>>> path = input("Input path")
Input path"/Users/bfellows2/so"
>>> dirs = os.listdir(path)
>>> dirs
['bar.txt', 'foo.txt']
>>> for i in range(0,len(dirs)):
... os.rename(os.path.join(path, dirs[i]), str(i))
...
>>>
[1]+ Stopped python
Helcaraxe:so bfellows2$ ls -al
total 0
drwxr-xr-x 4 bfellows2 bfellows2 136 Sep 3 20:30 .
drwxr-xr-x 100 bfellows2 bfellows2 3400 Sep 3 20:24 ..
-rw-r--r-- 1 bfellows2 bfellows2 0 Sep 3 20:24 0
-rw-r--r-- 1 bfellows2 bfellows2 0 Sep 3 20:24 1
Helcaraxe:so bfellows2$ python -V
Python 2.6.1