这个重命名文件的Python代码有什么问题?

1 投票
1 回答
2560 浏览
提问于 2025-04-17 01:22

这段代码的目的是让你选择一个文件夹,然后列出那个文件夹里的所有文件,接着把这些文件重命名为它们在列表中的位置。不过,我总是遇到错误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

撰写回答