python - 在 python 中读取非常大的文本文件确实可以正确迭代

标签 python

我有一个 1.4GB 的文件,我试图迭代每一行,我尝试了正常的方法,但发生了这种情况:

counter = 0
with open("myfile.txt") as infile:
    for line in infile:
        counter+=1
        if target in line:
            print line
print counter

658785

好吧,一切看起来都不错,但后来我意识到计数比应有的要低得多,所以我写了这个:

textfile = open("myfile.txt") 
while True:
    line = text_file.readline()
    if not line: break
    counter+=1
print counter

行数相同,但我知道这个文件有超过 2000 万行,有人知道我做错了什么吗?

编辑:似乎人们怀疑我是否正在读取正确的文件,我如何验证行等。

所以这只是一个简单的例子,如果我运行这个:

counter=0
total_lines = 0
while True:
    line = text_file.readline()
    total_lines+=1
    if target in line:
        print line.split("|")[0].strip(), counter, total_lines
        counter+=1

这是我的输出:

HAIRY MOOSE 0 4722388
HAIRY MOOSE 1 4722389
HAIRY MOOSE 2 4722390
....
....
IN *HAIRY MOOSES CLEANING 45 12244264
IN *HAIRY MOOSES OF TU 46 12244265
IN *HAIRY MOOSES OF TULSA 47 12244266

但如果我以另一种方式阅读它,它会在找到单个匹配项之前完成。

最佳答案

按照您的方式迭代文件本质上没有任何问题。我打开过更大的文件并以同样的方式处理它们; there is no size limit on files in python

可能的解释:

  • 您的文件未划定换行符。无论你使用什么来计算线数,其描绘方式都与 python 不同。
  • 对文件进行某种并发修改。在此发生之前,您是否正在代码中编辑该文件?是否有另一个程序动态编辑该文件?文件在实际检查和运行时之间是否有可能发生更改?

检查方式:

  • 手动检查(最后)行打印出这些行(或者可能只是最后一行)。如果它与文本文件中的最后一行相同,则问题可能不是资源正在被修改。

  • 尝试手动拆分使用 read()而不是readline()然后手动拆分并遍历。如果len(myfile.read().split('\n'))没有给出正确的答案,但是 len(myfile.read().split('\r'))是的,也许是 delineation problem 。也许这两个数字之和就是您要查找的数字?

  • 检查行长度,直到找到错误的长度这些行是否足够长?在您确信的独立事实检查地面真相机器中,生成行长度的计数。然后遍历并验证每一行的长度是否符合 Python 中应有的长度。如果我的数学成立,则不可能出现以下情况:(1)每行的长度正确并且(2)两个文件中的字符总数相同(顺便说一句:验证这一点),但是(3)您没有考虑正确的行数。取出第一条长度不正确的线并手动检查它。 python 令人困惑的地方是什么(再次,我预计会出现描述问题)

  • 更改您的 read mode ,取决于文件类型:

The default is to use text mode, which may convert '\n' characters to a platform-specific representation on writing and back on reading. Thus, when opening a binary file, you should append 'b' to the mode value to open the file in binary mode, which will improve portability. (Appending 'b' is useful even on systems that don’t treat binary and text files differently, where it serves as documentation.) See below for more possible values of mode

.

  • 仔细检查您的基本事实,然后...您确定需要这样做吗?我希望您已经验证了您的基本事实。 (我很少对我的独立行数持“积极态度”)。它是一个数字文件吗?也许你可以使用numpy.loadtxt 。你可以使用 pandas ?它是一个数据库吗?如果它是 .mat 文件中的矩阵,可能是 scipy.loadmat会有用的。海量数据很少是随机格式化的,而且大多数有用的格式人们已经做得很好,因此手动解析长文件可能不是你最好的选择,在这种情况下,一些神秘的东西更有趣不是来解决。

关于python - 在 python 中读取非常大的文本文件确实可以正确迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33902383/

相关文章:

Python 2.7 类属性奇怪的行为

python - Jinja2/Python - 字符串到整数的比较

Python:通过 SSH 连接到 Cisco 设备并运行 show 命令

python - Django,如何动态访问,对象的相关模型

python - Django、Postgresql 和 IntegrityErrors

python - _ElementInterface 实例没有属性 'tostring'

python - 在 Linux Mint 上标准安装后 Anaconda 导航器不运行

python - Python 中的二阶导数 - scipy/numpy/pandas

python - BeautifulSoup 用原始 xml 替换标签而不解析/转义

python - 无法分配 "...' ": "..." must be a "User" instance