基于字典 Python 移动带有子文件夹的文件

Moving files with subfolders based on dictionary Python

提问人:NerdBurgler 提问时间:11/7/2023 最后编辑:tripleeeNerdBurgler 更新时间:11/7/2023 访问量:40

问:

我正在尝试找出一种更快的方法来复制和移动位于多个子文件夹中的 pdf 文件。如果文件位于主文件夹目录中的任何位置,我使用的当前代码将找到该文件,但考虑到子文件夹和文件的数量,这需要很长时间。我当前的代码已经将以下字母写入了 Python:

嗨,蟒蛇! 看到我发给你的列表中的最后一列了吗?只需查看此位置中所有这些文件夹和子文件夹所在的所有文件夹和子文件夹,即可找到该 pdf。当你这样做时,复制并移动到我发送给你的这个其他位置。 别着急!

我想写给 Python 的信:

亲爱的 Python, 拿这个清单。第一列是文件夹,第二列是子文件夹,最后一列是pdf。 我将为您提供所有这些文件夹和子文件夹所在的位置。 到达该位置后,打开第一个文件夹,然后搜索第二个文件夹。 找到第二个文件夹后,打开此文件夹并搜索 pdf。 找到 pdf 后,请复制并将其移动到我发送给您的其他位置。

出于某种原因,我很难理解接下来的步骤。我可以请你有你的专业知识吗(这里是相当新的PyUser)?

我导入了一个列表,其中包含 .txt 中所需的文件:

TESTFOLDER_FROM0|TESTSUBFOLDER_FROM0|TEST1.pdf
TESTFOLDER_FROM0|TESTSUBFOLDER_FROM0|TEST2.pdf
TESTFOLDER_FROM1|TESTSUBFOLDER_FROM1|TEST3.pdf
TESTFOLDER_FROM2|TESTSUBFOLDER_FROM2|TEST4.pdf
TESTFOLDER_FROM3|TESTSUBFOLDER_FROM5|TEST5.pdf
TESTFOLDER_FROM5|TESTSUBFOLDER_FROM8|TEST6.pdf
TESTFOLDER_FROM637|TESTSUBFOLDER_FROM11|TEST7.pdf

这是有效的蜗牛代码:

import csv
import os
import shutil

csv_path = input('Enter path to chart list text file: ')
csv_path = csv_path.replace("\\", "/")
csv_path = csv_path.replace("\"", "")

base_path = input('Enter base path where charts are to be copied FROM: ')
base_path = base_path.replace("\\", "/")
base_path = base_path.replace("\"", "")

destination_path = input('Enter path where the files should be copied TO: ')
destination_path = destination_path.replace("\\", "/")
destination_path = destination_path.replace("\"", "")

def find_file(base_path, file_name):
    for root, dirs, files in os.walk(base_path):
        if file_name in files:
            return os.path.join(root, file_name)
    return os.path.join(root, file_name)

find_file(base_path, csv_path)

with open(csv_path, 'r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter='|')
    for row in csv_reader:
        print("CSV Row:", row)
        _, _, file_name = row
        file_path = find_file(base_path, file_name)
        if file_path:
            print("Found File Path:", file_path)
            print("Copying file to:", destination_path)
            shutil.copy(file_path, destination_path)
        else:
            print("File not found!")
python 循环 迭代 shutil os.walk

评论

0赞 tripleee 11/7/2023
替换文件名中的反斜杠和引号是怎么回事?只是不要输入这些字符,如果它们不是路径的一部分。input

答:

1赞 tripleee 11/7/2023 #1

您的问题描述很难理解,但基本问题似乎是您重复运行在同一个文件树上。显而易见的优化是只运行一次,并让它查找您要查找的所有文件。像这样的东西?os.walk

def find_em_all(paths, basedir):
    for root, subdirs, files in os.walk(basedir):
        head = root.split(os.sep)[-2:]
        for file in files:
            pathtail = os.path.join(*head, file)
            if pathtail in paths:
                yield os.path.join(root, file)

称其为

needles = [
    'one/wanted/path.pdf',
    'another/desired/file.pdf'
]
for found in find_em_all(needles, '/your/haystack/directory'):
    ... # do something with found

中的代码基本上要求所有搜索表达式完全位于您遍历的目录树中,或者起始目录是绝对路径(因此,如果您的当前目录是并且您有一个文件,则它不会找到它,因为它只能看到)。如果在绝对路径太靠近根目录的目录中启动它,则还会出现一种极端情况,无法从 .find_em_all/home/you/home/you/want/this.pdffind_em_all('you/want/this.pdf', '.')./want/this.pdfsplit

评论

0赞 khachik 11/7/2023
这是一个干净优雅的解决方案,对变量名称表示赞赏。
0赞 NerdBurgler 11/7/2023
这太好了,谢谢!
0赞 tripleee 11/8/2023
如果这解决了您的问题,请考虑接受它。或者,您可以发布自己的答案,并接受它。接受答案有助于未来的访问者将问题标记为已解决。另请参阅帮助。