使用Python中的进度指示器迭代大文件?

Ger*_*nuk 6 python

我正在迭代一个大的csv文件,我想打印出一些进度指示器.据我所知,计算行数需要解析换行符的所有文件.所以我不能轻易估计行号的进度.

还有什么我可以做的,以便在阅读行时估计进度?也许我可以按尺寸去?

dmr*_*lev 8

请检查这个名为tqdm https://github.com/noamraph/tqdm的小型(有用)库. 只需包装一个迭代器,然后在循环执行时显示冷却进度表.

图像说明了一切.

在此输入图像描述

  • 这确实非常酷,我会得到它.它没有完全回答这个问题,但我喜欢它. (4认同)

Sai*_*kar 7

您可以使用它os.path.getsize(filename)来获取目标文件的大小.然后,当您从文件中读取数据时,可以使用简单的公式计算进度百分比 currentBytesRead/filesize*100%.该计算可以在每N行的末尾完成.

对于实际进度条,您可以在控制台中查看Text Progress Bar

  • 我认为`f.tell()`足以得到一个字节位置,但我注意到如果你遍历一个文件,`tell()`方法被禁用(它读取8k的块,但这对我来说没关系).我不认为字符到字节的长度足以估计文件的其余部分.另一个困难是我正在使用`csv.reader`,这使得这里的一些建议变得复杂.我希望`tell`能奏效. (3认同)

Yoh*_*ake 6

这是基于 @Piotr 对 Python3 的回答

import os
import tqdm

with tqdm(total=os.path.getsize(filepath)) as pbar:
    with open(filepath) as file:
        for line in file:
            pbar.update(len(line.encode('utf-8')))
            ....
        file.close()
Run Code Online (Sandbox Code Playgroud)


Ade*_*yan 5

您可以使用os.path.getsize(或os.stat)来获取文本文件的大小.然后,每当您解析一个新行时,以字节为单位计算该行的大小并将其用作指示符.

import os
fileName = r"c:\\somefile.log"
fileSize = os.path.getsize(fileName)

progress = 0
with open(fileName, 'r') as inputFile:
    for line in inputFile:
        progress = progress + len(line)
        progressPercent = (1.0*progress)/fileSize

#in the end, progress == fileSize
Run Code Online (Sandbox Code Playgroud)


Pio*_*pla 5

您可以通过以下方式将tqdm与大文件一起使用:

import os
import tqdm

with tqdm.tqdm(os.path.getsize(filename)) as pbar:
   with open(filename, "rb") as f:
      for l in f:
          pbar.update(len(l))
          ...
Run Code Online (Sandbox Code Playgroud)

如果您读取utf-8文件,则len(l)不会提供确切的字节数,但它应该足够好。

  • 它已更改为:`与tqdm.tqdm(total = os.path.getsize(file))一起使用pbar:` (2认同)