【问题标题】:Get length of CSV to show progress获取 CSV 的长度以显示进度
【发布时间】:2016-12-25 19:18:34
【问题描述】:

我正在处理大量 CSV 文件,每个文件都包含大量行。我的目标是逐行获取数据并使用 Python 将其写入数据库。但是,由于有大量数据,我想跟踪已写入的数据量。为此,我计算了排队的文件数量,并在每次文件完成时继续添加。

我想对 CSV 文件执行类似的操作,并显示我所在的行以及总共有多少行(例如:Currently on row 1 of X)。我可以通过从一个开始然后执行以下操作轻松获得当前行:currentRow += 1,但是我不确定如何在不经过耗时的阅读行的情况下获得总数。

另外,因为我的 CSV 文件都存储在 zip 档案中,我目前正在使用 ZipFile 模块读取它们,如下所示:

#The Zip archive and the csv files share the same name
with zipArchive.open(fileName[:-4] + '.csv', 'r') as csvFile:
    lines = (line.decode('ascii') for line in csvFile)
    currentRow = 1

    for row in csv.reader(lines):
        print(row)
        currentRow += 1

关于如何快速获取 CSV 文件的总行数有什么想法吗?

【问题讨论】:

  • Row count in a csv file的可能重复
  • 您是否试图避免读取该文件?如果没有,您可以使用lines = len(open(csv).readlines())
  • @double_j 是正确的,我试图避免遍历每一行以计算总行数。但是,因为我正在读取存储在 zip 存档中的 CSV 文件,所以您的解决方案可能不适用。我更新了我的代码来解释我的过程。
  • 从字面上看,这是您可以计算 csv 文件中行数的唯一(合理)方法 - 使用 csv 阅读器读取它。
  • 我认为您应该查看getting line count cheaply in Python。这有很多相关的好答案。

标签: python csv


【解决方案1】:

以下作品适合我:

  • 安装tqdm:pip install tqdm
  • 读取 csv 并显示进度的代码:
    with open('./data.csv') as csv_file:
        lines = len(csv_file.readlines())

    with open('./data.csv') as csv_file:
        csv_reader = csv.reader(csv_file, delimiter=',')
        header = next(csv_reader)

        for row in tqdm(csv_reader, total=lines):
            print(row)

【讨论】:

    【解决方案2】:

    如果您只是想显示一些进展,您可以尝试使用tqdm

    from tqdm import tqdm
    
    with zipArchive.open(fileName[:-4] + '.csv', 'r') as csvFile:
        lines = [line.decode('ascii') for line in csvFile]
        currentRow = 1
    
        for row in tqdm(csv.reader(lines), total=len(lines)):
            print(row)
            currentRow += 1
    

    这应该会为您提供一个流畅的进度条,您几乎无需付出任何努力。

    【讨论】:

    • 哇,这真的很简单。但是,当我尝试按照您上面提到的方式(for row in tqdm(csv.reader(lines)))使用它时,它不会显示条形,而是显示一系列上升的数字:像这样:3589382it [00:20, 171812.07it/s]。我认为这是因为它使用了变量lines,它是一个生成器,我怀疑它可以做类似len(lines 的事情,关于如何解决这个问题的任何想法?
    • @ng150716 tqdm 似乎不会给你一个进度条,除非它知道总长度。出于这个原因,我们需要将行存储为列表并获取其长度。可能有更优化的方法可以做到这一点,但如果您想知道生成器的总长度,您必须一直运行它。
    • 好的,所以我决定重写我的程序,而不是直接从 zip 存档中读取 csv。我先提取它,然后阅读它,它允许我从阅读器创建一个列表,从而创建一个计数。
    • 更理想的方法是先逐行浏览整个 CSV 文件(您仍然可以显示 tqdm 但没有总数,只是为了显示预处理的进展情况),然后总计,您现在可以再次浏览 CSV 文件,将每一行插入到数据库中,并使用 tqdm 条和正确的总计(从而显示真实的进度条)。
    【解决方案3】:

    如果不打开文件并计算行数,就无法计算文件中的行数。

    如果您的文件太大以至于无法使用 row_count = sum(1 for row in file_handle) 计算行数,并且无法将整个文件读入内存,则可能需要采用不同的方法。

    以字节为单位获取文件的长度非常容易 (How to check file size in python?)。如果您在阅读时计算每行的长度(以字节为单位),则可以报告“Currently on byte 13927 of 4972397 (2.8%)”

    对于以 zip 格式存储的文件,Zipfile.getinfo(name).file_size 是未压缩文件的大小。

    【讨论】:

    • 从技术上讲,对于 csv 文件,如果带引号的字符串中有换行符,这可能会产生错误。
    • @WayneWerner 它可以,但是没有办法在不读取文件的情况下获取文件中的 csv 行数。这是对下一个最好的事情的尝试。该错误可能并不严重
    • 这可能算不上什么胜利。我很想知道大小文件的时间差异是什么 - 进行比较会使这个答案更有用
    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2016-04-02
    相关资源
    最近更新 更多