当前位置: 首页 > 面试题库 >

如何在不读取整行或整个文件的情况下读取令牌

叶福
2023-03-14
问题内容

是否有一种隐藏的方法可以在 读取整行的 情况下
从文件或类似文件的对象读取令牌?我立即拥有的应用程序(其他人的问题,不是我的问题)正在将具有几个非常长的行的大型矩阵转置,本质上是itertools.izip()对选择单个列元素的迭代器执行操作。这个想法不是在迭代过程中将整个文件存储在内存中。

这些行是用空格分隔的ASCII十进制数字。

对于Java的Scanner类,问题可能很简单,但我没有在Python标准库中看到没有将整个输入都放在字符串中就进行标记化的任何内容。

作为记录,我知道如何独自编写。我只是想知道是否有一个我错过的标准工具。可以轻松安装的FOSS /自由软件也很好,但是我在PYPI上也看不到任何东西。

完整的问题是采用样本输入:

"123 3 234234 -35434 112312 54 -439 99 0 42\n" +
"13 456 -78 910 333 -44 5555 6 8"

…并产生输出(作为生成器,而无需立即将所有非常长的行读入内存

[123, 13], [3, 456], [234234, -78], ...etc

正如我所说的,它实际上是itertools.izip(iterator1,iterator2),将iterator1指向文件的开头,而iterator2刚经过换行符以读取第二行。


问题答案:

从文件中逐个读取令牌;您可以使用re模块从内存映射文件生成令牌:

#!/usr/bin/env python3
import re
import sys
from mmap import ACCESS_READ, mmap

def generate_tokens(filename, pattern):
    with open(filename) as f, mmap(f.fileno(), 0, access=ACCESS_READ) as mm:
         yield from re.finditer(pattern, mm)

# sum all integers in a file specified at the command-line
print(sum(int(m.group()) for m in generate_tokens(sys.argv[1], br'\d+')))

即使文件不适合内存,它也可以工作。



 类似资料:
  • 我正在基于Tomcat servlet和NIO创建服务。输入时有大的XML请求(约100 MB),通过HTML POST方法发送。我只想流前8千磅,然后立即发送响应到客户端。 当我尝试发送小请求(内容中只有几行)时,套接字工作正常。 2016-02-01 10:44:52 Http11NioProtocol[DEBUG]套接字:[org.apache.tomcat.util.net.NioEndp

  • 问题内容: 在Linux中,我有一个很大的文件,文件末尾附加了一些无关的信息。例如,假设我知道一个1.6GB文件的末尾有314个字节的无关数据。 当然,将更多数据添加到文件末尾是非常容易和有效的,但是我可以怎么做才能删除它,而不必将该文件的第一部分复制到另一个文件中(或覆盖所述文件)? 编辑 我在C中看到了一些很好的建议。我希望从命令行编写脚本,但是如果没有,我会比C更倾向于在python中进行编

  • 问题内容: 是否有比以下方法更好的方法来将整个html文件读取为单个字符串变量: 问题答案: 有来自Apache Commons 的实用程序。 如果您使用的还有和。

  • 问题内容: 我正在解决Programming Pearls,第二版,第1列中的问题。其中一个问题涉及编写一个程序,该程序仅使用大约1 MB的内存将文件内容存储为位数组,每个位代表是否或文件中没有7位数字。由于Java是我最熟悉的语言,因此即使作者似乎已经想到了C和C ++,我还是决定使用它。 由于我是为了解决我正在处理的问题而假装有限的内存,因此我想确保读取文件的过程完全没有缓冲。 在我阅读Jav