Python - 按分隔符出现次数拆分大字符串

Ind*_*die 7 python string split

我还在学习Python,我有一个我无法解决的问题.我有一个非常长的字符串(数百万行),我希望根据指定的出处次数将其拆分成较小的字符串长度.

例如:

ABCDEF
//
GHIJKLMN
//
OPQ
//
RSTLN
//
OPQR
//
STUVW
//
XYZ
//
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想基于"//"进行拆分,并在第n次出现定界符之前返回所有行的字符串.

因此,将字符串除以1的输入将返回:

ABCDEF
Run Code Online (Sandbox Code Playgroud)

将字符串拆分为//的输入将返回:

ABCDEF
//
GHIJKLMN
Run Code Online (Sandbox Code Playgroud)

将字符串按//除以3的输入将返回:

ABCDEF
//
GHIJKLMN
//
OPQ
Run Code Online (Sandbox Code Playgroud)

等等... 但是,当我只是尝试拆分整个字符串并使用"//"并且只使用各个索引时,原始的200万行字符串的长度似乎是一个问题.(我收到内存错误)也许Python在一次拆分中无法处理这么多行?所以我不能这样做.

我正在寻找一种方法,当我可能只需要100时,我不需要将整个字符串分成十万个索引,而是从开始直到某一点开始,停止并返回它之前的所有内容,我假设也可能更快?我希望我的问题尽可能清楚.

是否有一种简单或优雅的方式来实现这一目标?谢谢!

Bre*_*rne 1

如果您想使用文件而不是内存中的字符串,这里是另一个答案。

该版本被编写为一个函数,该函数读取行并立即打印出来,直到找到指定数量的分隔符(不需要额外的内存来存储整个字符串)。

def file_split(file_name, delimiter, n=1):
    with open(file_name) as fh:
        for line in fh:
            line = line.rstrip()    # use .rstrip("\n") to only strip newlines
            if line == delimiter:
                n -= 1
                if n <= 0:
                    return
            print line

file_split('data.txt', '//', 3)
Run Code Online (Sandbox Code Playgroud)

您可以使用它将输出写入新文件,如下所示:

python split.py > newfile.txt
Run Code Online (Sandbox Code Playgroud)

通过一些额外的工作,您可以使用它argparse来将参数传递给程序。