【问题标题】:Python: Reading Specific Sections of Huge Text File (Possibly with Itertools)Python:读取巨大文本文件的特定部分(可能使用 Itertools)
【发布时间】:2020-05-05 00:08:52
【问题描述】:

简而言之,我正在尝试从文本文件中“提取”某些行(字符串)。但还有更多。

我有一个相当大的文本文件(100,000 行,60 MB)。有些数据很重要,有些则不重要。有数百个这样的块。没有规律,一个停止的地方,下一个不一定开始。

我已经解析了文件以确定哪些行是我感兴趣的。现在,我有一个字典,其中包含“开始”行号作为键,然后将所需的连续行数作为值。这里:

paired_points =
{51: 7,
 69: 67,
...
 870623: 1730,
 872364: 1801}



len(paired_points) = 
783

我可以将其转换为明确的“开始”和“停止”整数(例如,51 -> 58、69 -> 136 等),但这仍然对我没有帮助。

我正在尝试使用 itertools 中的 islice,但它返回了一个 islice 对象列表。

from itertools import islice

file = r'575852.roi'

f = open(file, "r")

a = list()

for key in paired_points:
    with open(file) as f:
        try:
            a.append(islice(f, key, key + int(paired_points[key]))) # Start and stop lines

这在概念上有效 - 但我需要将 islice 对象转换为字符串。我的意思是,我正在寻找文本文件中的行(字符串)列表。

任何帮助将不胜感激。提前谢谢你!

【问题讨论】:

  • 为什么不直接阅读所有要列出的行,然后执行lines[start:end] 来获取您的零件?

标签: python file parsing text itertools


【解决方案1】:

解决方案

我自己解决了这个问题(将感兴趣的行转换为字符串,然后转换为浮点数组)。实际上,我还需要“清理”每一行——通过将文本行拆分为三个浮点值(与 (X, Y, Z) 坐标相关)。在我们构建了一个字符串列表之后,这是使用最后一行的内置 map() 函数执行的。

f = open(file, "r")
a = f.readlines()
f.close()

ext_pts = list()
for key in paired_points:
    a1 = a[key : key + paired_points[key]]
    ext_pts.append(a1)

ext_pts2 = list(itertools.chain.from_iterable(ext_pts))
ext_pts2 = np.asarray(list(map(sanitize, ext_pts2)))

ext_pts 现在是 (X, Y, Z) 点的 Nx3 numpy 数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多