python - 根据模式将一个文件拆分为多个文件(切割可以发生在行内)

标签 python perl awk split gnu

存在很多解决方案,但这里的特殊性是我需要能够在一行内进行拆分,切割应该发生在模式之前。例如:

文件:

<?xml 1><blabla1>
<blabla><blabla2><blabla>
<blabla><blabla>
<blabla><blabla3><blabla><blabla>
<blabla><blabla><blabla><?xml 4>
<blabla>
<blabla><blabla><blabla>
<blabla><?xml 2><blabla><blabla>

应该变成带图案的<?xml

输出文件 1:

<?xml 1><blabla1>
<blabla><blabla2><blabla>
<blabla><blabla>
<blabla><blabla3><blabla><blabla>
<blabla><blabla><blabla>

输出文件 2:

<?xml 4>
<blabla>
<blabla><blabla><blabla>
<blabla>

输出文件 3:

<?xml 2><blabla><blabla>

实际上是perl验证答案中的脚本 here对于我的小例子来说效果很好。但它会为我更大(约 6GB)的实际文件生成错误。错误是:

panic: sv_setpvn called with negative strlen at /home/.../split.pl line 7, <> chunk 1.

我没有发表评论的权限,这就是我开始新帖子的原因。 最后,Python解决方案将更加感激,因为我更了解它。

最佳答案

这会在不将所有内容读入 RAM 的情况下执行拆分:

def files():
    n = 0
    while True:
        n += 1
        yield open('/output/dir/%d.part' % n, 'w')


pat = '<?xml'
fs = files()
outfile = next(fs) 

with open(filename) as infile:
    for line in infile:
        if pat not in line:
            outfile.write(line)
        else:
            items = line.split(pat)
            outfile.write(items[0])
            for item in items[1:]:
                outfile = next(fs)
                outfile.write(pat + item)

警告:如果您的模式跨越多行(即包含“\n”),这将不起作用。考虑 mmap solution如果是这样的话。

关于python - 根据模式将一个文件拆分为多个文件(切割可以发生在行内),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12717294/

相关文章:

python - Linux 上缺少 Selenium Firefox 配置文件

perl - 如何将附加参数 POST 到 editurl?

regex - 查找大写字母的运行

Linux - 找到一个字符串并获取下一部分

python - awk:致命:无法打开文件 'file' 进行读取(权限被拒绝)

python - PyQt4:按包含图标的列对 QTableWidget 进行排序

python - 当没有分配新的内容时,Pypy 内存使用量会增加

python - mysql插入代码产生以下错误: Not all parameters were used in the SQL statement

arrays - 使用 Perl 比较一组字符串和一个文件

shell - 在 shell 脚本中调用 awk