字符串完全匹配时拆分文件

时间:2017-09-04 23:56:54

标签: python

我有一个巨大的文本文件,我需要根据匹配的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

感谢您的帮助。

2 个答案:

答案 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)

其他评论:

  • Python不使用;
  • 您的原始代码未使用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'行也出现在输出文件中,则必须稍微重新订购。