如何在Python中使用字符串分隔符将文件拆分成块 [英] How to split file into chunks by string delimiter in Python

查看:0
本文介绍了如何在Python中使用字符串分隔符将文件拆分成块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将一个可能很大的CSV文件上传到我的应用程序中。该文件的每个部分都由#TYPE *表示。我应该如何开始将其拆分成块并对每个块进行进一步处理?每个区块都是一个标头列表,后面跟着所有值。

现在我已经编写了单个块的处理,但我不确定如何对每个块执行操作。我认为正则表达式操作将是最好的选择,因为#TYPE *会不断返回。

#TYPE Lorem.Text.A
...
#TYPE Lorem.Text.B
...
#TYPE Lorem.Text.C
...

更新

此解决方案已从将所有节保存在一个文件中更改为将所有节保存到单独的文件并将它们压缩到一个压缩文件中。该压缩文件由Python读取并进行进一步分析。如果有人对该解释感兴趣,请给我留言,我将更新此问题。

来自@Padraic的答案对旧课程最有帮助。

推荐答案

您可以使用GROUPBY,假定节由#TYPE开头的行分隔开:

from itertools import groupby, chain


def get_sections(fle):
    with open(fle) as f:
        grps = groupby(f, key=lambda x: x.lstrip().startswith("#TYPE"))
        for k, v in grps:
            if k:
                yield chain([next(v)], (next(grps)[1]))  # all lines up to next #TYPE

您可以在迭代时获取每个节:

In [13]: cat in.txt
#TYPE Lorem.Text.A
first
#TYPE Lorem.Text.B
second
#TYPE Lorem.Text.C
third

In [14]: for sec in get_sections("in.txt"):
   ....:     print(list(sec))
   ....:     
['#TYPE Lorem.Text.A
', 'first
']
['#TYPE Lorem.Text.B
', 'second
']
['#TYPE Lorem.Text.C
', 'third
']

如果没有其他行以#开头,那么在开始时使用#就足够了,您的模式中没有什么复杂的东西,所以它不是真正的正则表达式用例。这样一次也只将一个部分而不是整个文件存储到内存中。

如果没有前导空格,并且#出现在type之前,则只调用groupby:

就足够了
from itertools import groupby, chain


def get_sections(fle):
    with open(fle) as f:
        grps = groupby(f)
        for k, v in grps:
            if k:
                yield chain([next(v)], (next(grps)[1]))  # all lines up to next #TYPE

如果开始时有一些元数据,您可以使用DropWhile跳过行,直到我们点击#Type,然后只分组:

from itertools import groupby, chain, dropwhile


def get_sections(fle):
    with open(fle) as f:
        grps = groupby(dropwhile(lambda x: not x.startswith("#"), f))
        for k, v in grps:
            if k:
                yield chain([next(v)], (next(grps)[1]))  # all lines up to next #TYPE

演示:

In [16]: cat in.txt
meta
more meta
#TYPE Lorem.Text.A
first
#TYPE Lorem.Text.B
second
second
#TYPE Lorem.Text.C
third

In [17]: for sec in get_sections("in.txt"):
            print(list(sec))
   ....:     
['#TYPE Lorem.Text.A
', 'first
']
['#TYPE Lorem.Text.B
', 'second
', 'second
']
['#TYPE Lorem.Text.C
', 'third
']

这篇关于如何在Python中使用字符串分隔符将文件拆分成块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆