我有一个巨大的文本文件,我需要根据匹配的EKYC'进行拆分。唯一的价值。但是,当其他具有相似模式的值显示时,我的脚本将失败。 我是Python新手,它让我疲惫不堪。
import sys;
import os;
MASTER_TEXT_FILE=sys.argv[1];
OUTPUT_FILE=sys.argv[2];
L = file(MASTER_TEXT_FILE, "r").read().strip().split("EKYC")
i = 0
for l in L:
i = i + 1
f = file(OUTPUT_FILE+"-%d.ekyc" % i , "w")
print >>f, "EKYC" + l
当有EKYCSMRT或EKYCVDA或EKYCTIGO时,脚本会中断,那么我该如何设置防护以防止在该点之前发生分裂。
This is the content of all of the messages
EKYC
WIK 12
EKYC
WIK 12
EKYCTIGO
EKYC
WIK 13
TTL
EKYCVD
EKYC
WIK 14
TTL D
感谢您的帮助。
答案 0 :(得分:0)
根据您的示例输入文件,您需要:split('\nEKYC\n')
#!/usr/bin/env python
import sys
MASTER_TEXT_FILE = sys.argv[1]
OUTPUT_FILE = sys.argv[2]
with open(MASTER_TEXT_FILE) as f:
fdata = f.read()
i = 0
for subset in fdata.split('\nEKYC\n'):
i += 1
with open(OUTPUT_FILE+"-%d.ekyc" % i, 'w') as output:
output.write(subset)
其他评论:
;
。os
。with open(<filename>, <mode>) as f: ...
,因为它会处理可能的错误并在之后关闭文件。答案 1 :(得分:0)
如果可能,您应该避免一次性将大文件读入内存。相反,一次流式传输它们。
明智的文本文件块通常是行。这可以使用.readline()
来完成,但只是迭代文件也会产生它的行。
在读取一行(包括换行符)之后,您可以.write()
将其直接写入当前输出文件。
import sys
master_filename = sys.argv[1]
output_filebase = sys.argv[2]
output = None
output_number = 0
for line in open(master_filename):
if line.strip() == 'EKYC':
if output is not None:
output.close()
output = None
else:
if output is None:
output_number += 1
output_filename = '%s-%d.ekyc' % (output_filebase, output_number)
output = open(output_filename, 'w')
output.write(line)
if output is not None:
output.close()
输出文件在其自己的行上遇到'EKYC'
时关闭并重置。
在这里,您会注意到输出文件直到有一行要写入之前才会(重新)打开:这样可以避免在没有其他行写入的情况下创建空输出文件。如果您希望'EKYC'
行也出现在输出文件中,则必须稍微重新订购。