【问题标题】:Python - process a chunk of lines in a filePython - 处理文件中的一大段行
【发布时间】:2016-10-20 10:25:23
【问题描述】:

我有一个包含x 值的文件,每个值都在自己的行中。 我需要能够从该文件中获取n 值的数量,将它们放入一个数组中,将该数组传递给一个新进程,清除该数组,然后从文件中获取另一个n 值的数量来提供给下一个过程。

我遇到的问题是当x 是一个像 12 这样的值时,我试图给每个进程提供 10 个值块。

第一个进程将获得前 10 个值没问题,但我无法将剩余的 2 个值分配给最后一个进程。

如果你告诉程序从文件中给每个进程 10 个值,但文件只有 1 个,甚至 9 个值,也会出现问题。

我需要知道我何时处于最后一组小于n的值

我想避免一次性获取文件中的每个值并将其存储在一个数组中,因为如果该文件中有数百万个值,我可能会遇到内存问题。

这是我尝试做的一个例子:

chunk = 10
value_list = []
with open ('file.txt', 'r') as f:
    for value in f:
        value_list.append(value)
        if (len(value_list) >= chunk):
            print 'Got %d' % len(value_list)
            value_list = [] # Clear the list
            # Put array into new process

在此示例中,这将捕获每 10 个,但如果文件中的开头恰好小于 10,它将不起作用。

【问题讨论】:

  • 只需在循环完成后使用来自value_list 的剩余数据来最后一次调用该进程(如果value_list 不为空)

标签: python arrays file


【解决方案1】:

在这种情况下,我通常做的只是处理 for 循环之后的最后一个(短)数组。例如,

chunk = 10
value_list = []
with open ('file.txt', 'r') as f:
    for value in f:
        if (len(value_list) >= chunk):
            print 'Got %d' % len(value_list)
            value_list = [] # Clear the list
            # Put array into new process
        value_list.append(value)
    # send left overs to new process
    if value_list:
        print 'Got %d' % len(value_list)
        # Put final array into new process

【讨论】:

  • 我编辑了我的帖子以包含value_list.append(value)。不知道为什么那不存在。只是想指出,如果你在 else 中有 value_list.append(value),如果它至少遇到一次 if 语句,它最终会跳过 nth 值。
  • 上面的代码有一个逻辑错误——每次到达chunksize都会跳过一行。解决方案:将append移出else分支。
  • @ShaunAran,布鲁诺,不错的收获!谢谢你俩。我已经更正了这个例子。
猜你喜欢
  • 2017-07-12
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 2014-05-22
  • 2015-08-19
  • 1970-01-01
相关资源
最近更新 更多