繁体   English   中英

创建基于文件名PYTHON的子目录并对文件进行排序

[英]Creating subdirectories and sorting files based on filename PYTHON

我的目录很大,其中包含许多带有修订版本的零件文件,我想为每个零件递归创建一个新文件夹,然后将所有相关文件移动到该文件夹​​中。 我试图通过隔离一个7位数的数字来做到这一点,该数字将用作部件的标识符,并且所有相关的文件名也将包括该数字。

import os
import shutil
import csv
import glob
from fnmatch import fnmatch, filter
from os.path import isdir, join
from shutil import copytree, copy2, Error, copystat
from shutil import copytree, ignore_patterns


dirname = ' '

# pattern =  '*???????*'

for root, dirs, files in os.walk(dirname):
    for fpath in files:
        print(fpath)
        if fpath[0:6].isdigit():
            matchdir = os.mkdir(os.path.join(os.path.dirname(fpath)))
            partnum = str(fpath[0:6])
            pattern = str(partnum)
            filematch = fnmatch(files, pattern)
            print(filematch)
            shutil.move(filematch, matchdir)

到目前为止,这就是我所拥有的,基本上我不确定如何获取原始文件名并将其用作其余文件的匹配模式。 我想用于此匹配模式的原始文件名只是7位数字,并且所有相关文件都可能带有其他字符(例如REV-2)。

不要想太多

我认为os.walk()给您带来的困惑让您感到困惑-重新检查文档 dirsfiles只是目录/文件名称的列表,而不是完整路径。

这是我的建议。 假设您从目录布局开始,如下所示:

directory1
    1234567abc.txt
1234567abc.txt
1234567bcd.txt
2234567abc.txt
not-interesting.txt

并希望以类似以下内容结束:

directory1
    1234567
        abc.txt
1234567
    abc.txt
    bcd.txt
2234567
    abc.txt
not-interesting.txt

如果是正确的话,则无需重新匹配目录中的文件,只需对每个文件进行单独操作,并仅在不存在零件目录的情况下创建零件目录。 我还将使用正则表达式来执行此操作,例如:

import os
import re
import shutil

for root, dirs, files in os.walk(dirname):
    for fname in files:
        # Match a string starting with 7 digits followed by everything else.
        # Capture each part in a group so we can access them later.
        match_object = re.match('([0-9]{7})(.*)$', fname)
        if match_object is None:
            # The regular expression did not match, ignore the file.
            continue

        # Form the new directory path using the number from the regular expression and the current root.
        new_dir = os.path.join(root, match_object.group(1))
        if not os.path.isdir(new_dir):
            os.mkdir(new_dir)

        new_file_path = os.path.join(new_dir, match_object.group(2))

        # Or, if you don't want to change the filename, use:
        new_file_path = os.path.join(new_dir, fname)

        old_file_path = os.path.join(root, fname)
        shutil.move(old_file_path, new_file_path)

请注意,我有:

  • 切换条件后,如果文件不有趣,我们将立即继续循环。 这是一种有用的模式,可用于确保代码不会缩进过多。
  • fpath的名称更改为fname 这是因为它不是路径,而只是文件名,因此最好将其命名为fname

如果这不是您的意思,请说明问题!

[edit]显示如何在不更改文件名的情况下复制文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM