首页 > 解决方案 > 有选择地将文件从一个文件夹目录复制到另一个

问题描述

我有一个目录树,其中文件夹的名称很重要。我也有一个来自folder1>folder2>folder3>foo.txt的csv说。folder1,folder2,folder3 和 txt 都在 csv 的不同列中。我需要保持目录结构不变并复制 csv 中给出的文件。

我正在尝试的方法是复制目录树并编写 python 代码来删除不需要的文件。所以有很多循环,但我在 csv 中有超过 415,000 行。

csv example:<br/>
pdf_no .   folder1. folder2 . folder3. <br/> 1 .  . abc. pqr. xyz.<br/>

这是 csv 的格式,我在 python 中借助 pandas 数据框提取列数据没有问题。最初它是一个 .dta 文件,我转换为.csv with pandas. So 'folder1' > 'folder 2' > 'folder 3' > 'pdf_no'.“pdf_no”。列包含文件名,这是我们想要在给定文件夹中维护文件结构的数字。

所以这需要很多时间,每当我再次改变一点时,它都会花费很多时间,我什至不知道它是否正确。

标签: pythonpython-3.xfile

解决方案


样本 csv

pdf_no,folder1,folder2,folder3
1,abc,def,ghi
2,xyz,pqr,
3,abc,def,ghi

示例代码

import csv
import os
import shutil


target_csv = 'selection.csv'
target_dir = 'selected_20190828/'
source_dir = 'original_directory/'

with open(target_csv) as f:
    rows = csv.reader(f)
    for line_no, row in enumerate(rows):
        if line_no == 0:  # Skip the first line because it's the title
            continue

        pdf_name = row[0] + '.pdf'
        dir_path = os.path.join(*row[1:])

        source = os.path.join(source_dir, dir_path, pdf_name)
        if not os.path.isfile(source):
            print('not exist: ', line_no, source)
            continue
        target = os.path.join(target_dir, dir_path)
        os.makedirs(target)
        shutil.copy2(source, target)

解释

pandas其实你不需要,你只需要

  • csv.reader将 csv 文件读入list
  • os.makedirs创建文件夹(此方法类似于mkdir -pbash)
  • os.path.join
  • shutil.copy2将文件复制到新文件夹
  • os.path.isfile确保原始文件存在

我已经测试了上面的代码。它应该工作。


推荐阅读