使用pathlib和for循环重命名文件夹中的文件



我用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方法。

最新更新