我用Python编写了以下重命名工具。它无意中将我的所有文件移动到一个目录中,直到我在for循环中添加了os.chdir,这使它工作得更好,并将每个重命名的文件都放在正确的文件夹中。但我真的不明白为什么这个脚本在没有os.chdir的情况下将我所有的文件移动到一个目录中,有人能帮我理解吗?非常感谢。
import pathlib
from pathlib import Path
import os
folderDir = Path(input("Please enter the parent directory: n"))
folderList = [folder for folder in folderDir.iterdir() if folder.is_dir()]
for f in folderList:
fileList = [e for e in f.iterdir() if e.is_file()]
os.chdir(f)
count = 1
for i in fileList:
folderName = os.path.basename(os.path.dirname(i))
i.rename(folderName + "_" + str(count).zfill(3) + pathlib.Path(i).suffix)
count += 1
我认为这是因为它将文件重命名为当前工作目录(即保存脚本的位置(,而不是存储文件的实际目录。
file = your/file/name.txt
os.path.dirname(file) # This gives 'your/file'
os.path.basename(your/file) # This gives 'file'
因此,脚本在您的cwd中创建了一个名为"file"的文件夹。通过在chdir(f(中添加,它在这个目录中创建,而不是因为这个目录已经存在,它修改了现有的文件。这就是你想要的。
我可能错了,但这是我的理解。我希望这是有道理的。
Pathlib文档状态:
目标路径可以是绝对路径,也可以是相对路径。相对路径是相对于当前工作目录来解释的,而不是Path对象的目录。
您使用os.path.basename()
中的值作为i.rename()
的第一个参数,它只提供文件夹名称,因此基本上创建了相对路径。
您的代码取决于用户给出的有效绝对路径。如果用户这样做,iterdir()
将返回绝对路径,否则将获得相对路径。
所以我建议对你的输入进行消毒,这样它总是给出绝对路径:
folderDir = Path(input("Please enter the parent directory: n")).absolute()
然后,如果你想放下os.chdir
(以及整个os
模块(,你可以这样做:
for i in fileList:
folderName = i.parent.name
i.rename(i.parent.parent, folderName + "_" + str(count).zfill(3) + pathlib.Path(i).suffix)
count += 1
folderName
仍应包含存储文件的文件夹,i.rename()
中的i.parent.parent
用于获取您操作的文件夹的绝对路径。否则,我只是用Pathlib文档中的表中的Pathlib方法替换了os.path
方法。