0

我是 Python 新手,我需要一个可以将同一天的文件复制到新文件夹中的程序。

示例文件:

20120807_first_day_pic.jpg
20120807_first_day_sheet.jpg
20120807_first_day_sheet2.jpg
20120907_second_day_pic.jpg
20120907_second_day_sheet.jpg
20120907_second_day_sheet2.jpg

这是我到目前为止所拥有的,但每个文件都有一个文件夹,而不是一整天。

import os, re, shutil

tfolder = 'D:/Testing/src/'

os.chdir(tfolder)

re_year19xxxxxx = re.compile('(19[0-9][0-9][0-9][0-9])')
re_year20xxxxxx = re.compile('(20[0-9][0-9][0-9][0-9])')

re_ed = re.compile('(ED[0-9])')
destPath = 'D:/Testing/Dest/'

def analyse_file_name(fname):
    filePath, coords = os.path.split(fname) #the new folders will be named according to the first 4 characters of the original file name
    coordsFolder = coords[:53]
    coordsFname = coords[:53]
    coordsExt = os.path.splitext(fname)
    year = 'year' #create variable year
    ed = 'ed' #create variable ed to store the edition number if necessary
    bname = fname #the original file name
    for re_year in (re_year19xxxxxx, re_year20xxxxxx):
        rx = re_year.search(fname) #search for regex in the file name and store it in rx
        if rx:
            year = rx.group(1) #if the regex is found, store the year
            bname.replace(year, ' ')
            res = re_ed.search(fname)
            if res:
                ed = res.group(1)
                bname.replace(ed, ' ')
        os.chdir(destPath)  
        if year is 'year':
            fname2 = os.path.join(destPath, coordsFolder) + '\\' + coordsFname + coordsExt[1]
        else:
            fname2 = os.path.join(destPath, coordsFolder,year,ed) + '\\' + coordsFname + coordsExt[1]
        print('%s -> %s' % (fname, fname2)) #debug print
        dirn, _ = os.path.split(fname2)
        if not os.path.exists(dirn):
            os.makedirs(dirn)
        shutil.copy(fname, fname2)

for root, dirs, files in os.walk(tfolder):
    for name in files:
        fn = os.path.join(root, name)
        analyse_file_name(fn)
4

4 回答 4

2

如果您只想复制以已知日期字符串格式开头的文件,那么这样的事情怎么样?

def copyfile(filepath, target_dir):
    p, filename = os.path.split(filepath)

    # get date component of name
    date_component = filename.split("_", 1)[0]

    # try to parse out the date
    try:
        d = datetime.datetime.strptime(date_component, "%Y%m%d")
    except ValueError:  
        print "Could not place: ", filename
        return
    target_date_dir = os.path.join(target_dir, str(d.year), str(d.month), str(d.day))
    os.makedirs(target_date_dir)
    shutil.copy(filepath, target_date_dir)
于 2012-07-09T07:39:14.500 回答
0

首先,创建一个 dict(adefaultdict在这里更方便),它将收集文件的日期(很好用re,但考虑到文件的名称使用split更容易):

>>> import os
>>> import re
>>> pat = r'(\d+)(?:_\d+)?_(\w+?)[\._].*'
>>> from collections import defaultdict
>>> dict_date = defaultdict(lambda : defaultdict(list))
>>> for fil in os.listdir(path):
    if os.path.isfile(os.path.join(path, fil)):
        date, animal = re.match(pat, fil).groups()
        dict_date[date][animal].append(fil)


>>> dict_date['20120807']
defaultdict(<type 'list'>, {'first': ['20120807_first_day_pic.jpg', '20120807_first_day_sheet.jpg', '20120807_first_day_sheet2.jpg']})

然后对于每个日期,创建一个子文件夹并在那里复制相应的文件:

>>> from shutil import copyfile
>>> for date in dict_date:
        for animal in dict_date[date]:
        try:
            os.makedirs(os.path.join(path, date, animal))
        except os.error:
            pass
        for fil in dict_date[date][animal]:
            copyfile(os.path.join(path, fil), os.path.join(path, date, animal, fil))

编辑:考虑到 OP 的新要求和 Khalid 的评论。

于 2012-07-09T07:43:31.783 回答
0
import os, shutil

src_path = "D:\\Testing\\Src\\"
dest_path = "D:\\Testing\\Dest\\"

for file in os.listdir(src_path):
    if not os.path.isdir(dest_path + file.split("-")[0]):
       os.mkdir(dest_path + file.split("-")[0])
shutil.copy(src_path + file, dest_path + file.split("-")[0])
于 2012-07-09T08:50:25.840 回答
0

正则表达式日 :) 尝试将文件名与

pattern=r'(?P<filedate>(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2}))\_(?P<bloodyrestofname>.*)'

完整的日期、年份等可以从匹配中的各个命名组中检索。

于 2012-07-09T10:46:15.440 回答