按每个lin上的前两个字符拆分大型平面文件

2024-09-30 10:31:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用逗号分隔的大文件~10gb。每行以一个2字符的代码开头,该代码指示它是哪种类型的行,因为每一行都是不同类型的事件。目前我将文件读入R,然后使用正则表达式根据代码将其拆分为不同的部分,然后将生成的对象写入平面文件。在

我很好奇是否有更直接的方法来完成这项工作(读取一行,确定行类型并将该行附加到适当的平面文件中(总共有7个)),比如Python、bash、sed/awk等等

数据如下:

01,tim@bigcompany.com,20140101120000,campaign1
02,201420140101123000,123321,Xjq12090,TX
02,201420140101123000,123321,Xjq12090,AK
...

如有任何建议,我们将不胜感激。在


Tags: 文件数据对象方法代码bash类型事件
3条回答

如果您不关心性能,或不信任您的操作系统/文件系统/驱动器的磁盘缓存:

with open('hugedata.txt') as infile:
    for line in infile:
        with open(line[:2] + '.txt', 'a') as outfile:
            outfile.write(line)

但是,不断地重新打开和重新关闭(并因此刷新)文件将意味着您永远无法获得缓冲的好处,而且只有这么多磁盘缓存可以弥补这一点,所以,您可能需要考虑预打开所有文件。因为只有7个,所以这很简单:

^{pr2}$

或者,更有力地说:

files = collections.defaultdict(lambda s: open(s+'.txt', 'w'))
try:
    with open('hugedata.txt') as infile:
        for line in infile:                
            files[line[:2]].write(line)
finally:
    for file in files:
        file.close()

(您可以编写一个with语句来自动完成关闭,但是在不同的Python版本中它会有所不同;这有点笨拙,但适用于从2.4到3.5甚至更高版本的所有内容,而且由于您还没有告诉我们您的平台或Python版本,这看起来更安全。)

在Python中这样做怎么样:

for line in file('hugedata.txt'):
    fh = file(line[:2] + '.txt', 'a')
    fh.write(line)

使用awk可以:

awk -F, '{fn=$1 ".txt"; print > fn}' file

如果您想在最后关闭所有文件句柄来保持干净,请使用此awk

^{pr2}$

相关问题 更多 >

    热门问题