微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在不加载完整内容的情况下在csv中查找行数的最佳方法

如何解决在不加载完整内容的情况下在csv中查找行数的最佳方法

最近几天我在工作中处理了许多4-5 Gb csv文件,因此我知道它们通过读写在熊猫方法的基础上编写了一些包装函数,从而取得了很大进展。一切似乎都工作得很好,有些开销,但便利超过了大多数问题。

同时,在读取csv时,为了使进度条显示正确的百分比,我需要提前知道行数,因为行数决定了会有多少块。我想出的最简单的解决方案是在开始加载其余部分并获取其大小之前,先简单加载csv的第0列。但是,当您拥有数百万行的文件时,这确实需要一些时间。

此外,读取单个列在总时间中所占的比例过高:在具有125列的csv中读取单个列需要几百万行的时间约为24秒,而读取整个文件则为63秒。

这是我用来读取csvs的函数

def read_csv_with_progressbar(filename: str,chunksize: int = 50000) -> pd.DataFrame:

    length = pd.read_csv(filename,usecols=[0])
    length = length.values.shape[0]

    total = length//chunksize
    chunk_list = []

    chunks = pd.read_csv(filename,chunksize=chunksize)
    with tqdm(total=total,file=sys.stdout) as pbar:
        for chunk in chunks:
            chunk_list.append(chunk)
            pbar.set_description('Reading source csv file')
            pbar.update(1)

        df = pd.concat([i for i in chunk_list],axis=0)

    return df

有什么方法可以比使用我有缺陷的方法更快地获取csv中的行数?

解决方法

假设您的CSV文件中没有带引号的字符串(其中包含换行符)或其他恶作剧,那么一种准确的(但很棘手的)解决方案是不解析文件,而只是计算文件中的换行数:

chunk = 1024*1024   # Process 1 MB at a time.
f = np.memmap("test.csv")
num_newlines = sum(np.sum(f[i:i+chunk] == ord('\n'))
                   for i in range(0,len(f),chunk))
del f

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?