存在很多解决方案,但这里的特殊性是我需要能够在一行内进行拆分,切割应该发生在模式之前。例如:
文件:
<?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/