[英]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()
给您带来的困惑让您感到困惑-重新检查文档 。 dirs
和files
只是目录/文件名称的列表,而不是完整路径。
这是我的建议。 假设您从目录布局开始,如下所示:
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.