根据文件名python或bash合并文件的好方法
我有数千个压缩的csv文件,名称如下:根据文件名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,
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模式的微小更改:将星号从括号中移出