Python 字符串完全匹配时分割文件
我有一个巨大的文本文件,需要根据匹配的“EKYC”值进行拆分。但是,当具有类似模式的其他值出现时,我的脚本将失败。 我是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
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()