我有一个包含以下数据的文本文件:
Schema:
Column Name Localized Name Type MaxLength
---------------------------- ---------------------------- ------ ---------
Raw Binary Binary 16384
Row 1:
Binary:
-----BEGIN-----
fdsfdsfdasadsad
fsdfafsdafsadfa
fsdafadsfadsfdsa
-----END-----
Row 2:
Binary:
-----BEGIN-----
fsdfdssd
fdsfadsfasd
fsdafdsa
-----END-----
Row 3:
Binary:
-----BEGIN-----
fsdafadsds
fsdafasdsda
fdsafadssad
-----END-----
我需要将“----BEGIN-----”和“----END-----”分隔符之间的数据提取到数组中。在
这就是我尝试过的:
^{pr2}$但是,这显然会获取'----BEGIN-----'分隔符之后的所有数据。在
我怎样才能加上结束计时器?在
请注意,该文件相当大,大约为1GB。在
如果您的文件足够小,可以将整个文件加载到内存中,那么使用正则表达式(又称regex)可能是最好的方法。在
输出
^{pr2}$这段代码创建了一个已编译的regex模式;在这种情况下,这并不是绝对必要的,因为我们只使用了一次模式,但它确实使代码看起来更整洁。在
该正则表达式查找由
'beginstr'
和'\n' + endstr
分隔的子字符串。由于使用了分组括号,findall
调用只捕获那些分隔符之间的内容。我在这些圆括号中放了一个'\n'
,这样捕获的子字符串总是有一个尾随的换行符。在对于和之间的多行,您希望将数据分为多个部分,只需捕获每个以-----BEGIN-…开头的块。。继续添加行,直到到达
END
:这些部分将被分成子列表:
^{pr2}$使用
with
打开文件,不要调用readlines,除非需要一个列表,否则可以像上面一样迭代file对象,而不必将所有内容存储在内存中。在或使用
itertools.takewhile
来获取节:如果您想要一个包含所有可以链接的单词的列表:
一个file对象返回它自己的迭代器,所以每次我们迭代或调用takewhile使用行时,takewhile将继续获取行,直到我们点击}来检查这个条件,而不是检查整个行。在
-----END----
然后我们继续迭代,直到找到另一条-----BEGIN-----
行,如果这些行总是以-
开头,而没有其他行以if line[0] == "-"
和{如果要处理每个部分,可以使用生成器表达式并处理每个部分中的行:
如果您想要单个字符串调用联接:
输出:
获取一个保持
-----BEGIN-----
和-----END-----
的字符串输出:
试试这个:
这将解决你的目的。在
相关问题 更多 >
编程相关推荐