根据文件名python或bash合并文件的好方法

根据文件名python或bash合并文件的好方法,python,bash,Python,Bash,我有数千个压缩的csv文件,名称如下: result-20120705-181535.csv.gz 181535的意思是18:15:35,现在我想每天合并这些文件(我有一周的数据,都像上面的例子一样命名),从早上2:00到第二天凌晨2:00,然后将处理过的文件移动到一个名为merged的文件夹中 因此,在当前文件夹中,我有大量的.csv.gz文件,我想扫描名称,合并所有内容,如20120705-02*,20120705-03*…直到20120706-01*到20120705结果.csv.gz,

我有数千个压缩的csv文件,名称如下:

result-20120705-181535.csv.gz
181535的意思是18:15:35,现在我想每天合并这些文件(我有一周的数据,都像上面的例子一样命名),从早上2:00到第二天凌晨2:00,然后将处理过的文件移动到一个名为merged的文件夹中

因此,在当前文件夹中,我有大量的.csv.gz文件,我想扫描名称,合并所有内容,如
20120705-02*,20120705-03*
…直到
20120706-01*
20120705结果.csv.gz
,然后移动
20120705-02*,20120705-03*
…直到
20120706-01*
文件到一个名为“合并”的文件夹中,并开始查找第二天的数据:
20120706-02*…20120707-01*


我想知道是使用python还是bash脚本来完成,以及如何创建包含以下行的文本文件:

#!/bin/bash

mkdir merged
shopt -s extglob

d1=$1
d2=$(date -d "$d1 +1 day")

for f in result-@($d1-@(0[2-9]|[1-2][0-9])|$d2-0[01])*.csv.gz ; do
  gzip -cd $f
  mv $f merged/$f
done | gzip > $d1-result.csv.gz
并使用
.sh
扩展名(比如myscript.sh)保存它。接下来,在终端中,键入

chmod +x myscript.sh
现在,您可以键入以下内容

./myscript.sh 20120705
然后它会按照你描述的那样做

要每天自动执行此操作,您可以在
/etc/crontab
文件中放置一行,如

2 2 * * * root ./myscript.sh 
假设创建最后一个.csv.gz文件需要1分钟,再加上额外的1分钟以确保:)

为了使这种自动化方式正常工作,需要对上面的脚本进行一些修改。假设它将在当天运行,更改定义日期的两行:

d1=$(date +%Y%m%d -d "now -1 day")
d2=$(date +%Y%m%d)

这样就可以了。像往常一样,在自动化之前要彻底测试它

这个答案完全没有经过测试,但希望它能为我们提供一个工作场所:

import datetime
import glob
from collections import defaultdict
import gzip
import os
import shutil

def day(fname):
    """
    Finds the "logical" day (e.g. the day minus 2 hours since your days 
    run from 2AM
    """
    d=datetime.datetime.strptime('result-%Y%m%d-%H%M%S.csv.gz')-datetime.timedelta(hours=2)
    return d.strftime('%Y%m%d')

files=sorted(glob.glob('result-*.csv.gz'))
cat_together=defaultdict(list)
for f in files:
    cat_together[day].append(f)

os.mkdir('merged')
for d,files in cat_together.items():
    outfile=gzip.open(d+'-result.csv.gz','wb')
    for f in files:
        gfile=gzip.open(f)
        outfile.write(gfile.read())
        gfile.close()
        shutil.move(f,'merged')
    outfile.close()

没有理由在那里使用bash-即使你遇到一个你不知道如何用Python执行的任务-让我们假设“ungzip”是一个文件,这是一个执行
os.system(“gunzip%s”%filename)
-的问题-因此你在bash中拥有了所有工具,并且Python的一致性和易于阅读/维护你所说的“合并”是什么意思?只需将CSV文件分组到同一个目录中,或者真的提取CSV文件并将它们(按顺序)附加到一个大文件中?@rody_o我的意思是将它们附加到一个大文件中因为您提到了bash,我想您应该在Linux中执行此操作,对吗?glob模式的微小更改:将星号从括号中移出