Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字符串完全匹配时分割文件_Python - Fatal编程技术网

Python 字符串完全匹配时分割文件

Python 字符串完全匹配时分割文件,python,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

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

感谢您的帮助。

根据您的示例输入文件,您需要:
split('\nEKYC\n')

其他意见:

  • Python不使用
  • 您的原始代码没有使用
    os
  • 建议使用带有open(,)的
    作为f:…
    ,因为它会处理可能的错误并在之后关闭文件

如果可能,您应该避免一次性将大文件读入内存。取而代之的是,一次流式处理它们的块

文本文件的合理块通常是行。这可以通过
.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'
行,则必须对其稍微重新排序。

您所说的“'EKYC'唯一值”是什么意思?请注意,如果您这样做:
'foo EKYCSMRT bar'.split('EKYC')
它将返回:
['foo',SMRT bar']
可能您希望按
'ECKYC'
进行拆分(包括前后的空格)?请澄清。PS:Python不使用
,或者您的代码正在使用
os
。如果它是一个巨大的文件(请定义您对巨大文件的想法),请不要预先阅读所有内容,请逐行阅读。我建议提供一个小的输入文件示例,这样我们就可以更好地理解您面临的问题。@PaulRooney好的,“大文件”这个词可能没有用,但我的意思是,在一个文件中,您将有多行EKYC代码。我需要分离EKYC代码的每个块,文本文件行是基于什么的?当EKYC在自己的线路上时,是否要拆分?或者以某种方式与同一行上的其他内容分隔?是否应包含在输出中?@jose.galarza这是一个文件,我的意思是EKYCSMRT,EKYCVD是EKYC代码的一部分EKYCSMRT和EKYCVD将位于两个EKYC块之间。谢谢。这个解决方案和我的很接近。我只是在写入子集之前添加了output.write('EKYC'),因为解决方案正在删除EKYC代码。它很有魅力。很高兴听到!注:@ephemient给出的答案有一个很好的提示,可以从文件中读取块(在示例中,一次读取一行),如果输入文件非常大(与您的机器规格相比),这将非常有用。
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()