为了账号安全,请及时绑定邮箱和手机立即绑定

不用Pandas轻松读取多个CSV 文件

更快、更节省内存的替代品,用于替代 Pandas 的 read_csv 函数。

图片由CyCoderX绘制。

在处理大规模数据集时,尤其是在数据工程或软件开发中,CSV 文件通常被用作数据存储和传输的首选格式。然而,使用 Python 的 Pandas 库读取这些文件的方法通常可能变得效率低下和缓慢,特别是在需要处理多个文件时。虽然 Pandas 是一个功能强大的工具,但对于需要高性能的应用程序来说,它可能不是最佳选择。

在这篇文章中,我们将探讨一种替代的方法来读取多个CSV文件,这种方法绕过了使用Pandas的需要。这种方法更快更高效,非常适合处理大规模数据。不论是想要优化代码的软件开发人员,还是希望简化数据管道的数据工程师,本指南会为您提供实用的见解和技巧。

让我们跳进去吧!

非常感谢您的支持,点赞一下吧!如果您喜欢PythonSQL数据工程数据科学,可以关注我,获取更多相关内容。😊谢谢!

CyCoderX

点击这里访问CyCoderX(CyCoderX中文站) (一个关于编程和技术的博客)的主页

CyCoderX 的数据相关文章

点击这里查看列表

14个小故事

理解Pandas read_csv的局限性

Pandas一直就是Python里处理数据的事实标准,尤其在操作CSV文件时。它因为简单易用并且功能丰富,成为了许多开发者的首选工具。然而,Pandas有一个显著的限制:它通常采用单线程模式,这在处理大数据集或执行复杂计算时会显得效率较低。这种情况在你需要频繁读取和处理多个CSV文件时尤为突出。

如果你非要用CSV文件工作,我强烈建议不要使用Pandas的CSV读写功能,原因如下:

    import pandas as pd   
    files = [...]  
    df_list = []  

    # 对于每个文件
    for file in files:  
        df_list.append(pd.read_csv(file))  

    # 最终的 DataFrame
    final_df = pd.concat(df_list)
Pandas方法的问题

上述方法虽然简单直接,但还是有几个缺点的。

  1. 迭代处理:循环引入了固有的迭代过程,这意味着一次只能处理一个CSV文件。这导致了可用资源的利用率低下。
  2. 单核执行:Pandas的read_csv方法以单核方式运行,进一步加剧了在大规模数据操作中的性能问题。
  3. 内存开销:在处理非常大的CSV文件或大量文件时,内存开销可能会变得非常大。Pandas会将整个CSV文件加载到内存中,这可能会导致内存耗尽,特别是在资源有限的环境中。
  4. 速度:虽然Pandas提供了许多自定义数据导入的选项,但它也牺牲了速度。这可能会显著减慢处理过程。

为什么考虑Pandas的替代方案呢?

尽管 Pandas 通常是首选解决方案,但在某些场景下,其他方法可能表现得更好。比如:

  1. 高速处理需求的应用场景:在需要快速处理的场景中,如实时数据处理或大规模数据管道,Pandas引入的开销可能成为一个缺点。
  2. 内存限制:在内存资源有限的环境中工作时,可以避免内存溢出和处理速度变慢。
  3. 更简单的应用场景:有时,Pandas的全部功能集并不必要,可以采用更轻量的方法实现期望结果,减少复杂性和资源消耗。

通过寻找替代方案,开发人员和数据架构师可以根据项目特定需求调整工具,从而优化速度和资源效率。

CyCoderX

CyCoderX

Python编年史 CyCoderX

点击这里查看Python的传奇故事列表
点击这里

33个故事呢

瑞典引入的csv模块:一种轻量级的替代方案
介绍csv模块:一种轻量级的替代方案

(最终版本只保留第二行)

介绍csv模块:一种轻量级的替代方案

Python 内置的 csv 模块提供了一种简单而强大的读取 CSV 文件的方式,不需要使用 Pandas。它属于 Python 的标准库,因此不需要安装额外的包。csv 模块在设计时考虑了性能,提供了一种更节省内存的处理 CSV 文件的方式,而不必承担 Pandas 的额外开销。

csv 模块的主要特点:
  1. 操作简化:与Pandas相比,csv模块按行处理文件,能够更高效地使用内存并且处理速度更快,特别是在处理大型数据集时。
  2. 灵活性:虽然比Pandas更简单,csv模块仍然提供了多种选项来自定义如何读取和处理CSV数据,包括指定分隔符、引号处理和缺失数据处理等选项。
  3. 非迭代处理csv模块的一个关键优势在于,可以以非迭代方式处理多个文件,减少了与文件循环相关的开销,从而提高了整体性能。
实际案例:一次性读取多个CSV文件

为了展示csv模块的强大功能和高效率,让我们通过一个不使用循环的实际例子来演示。目标是将多个CSV文件中的内容合并成一个单一的数据集,同时保持高性能和低内存使用。

第一步:设置文件路径

首先,我们需要收集所有需要处理的CSV文件的路径。这样,我们能使用更高效的方法,利用Python的glob模块,该模块可以帮助我们根据指定的模式检索文件路径。这样,我们就可以避免逐个处理文件,而是采取一种更为高效的方式。

    import glob   

    # 获取路径为 'path/to/csv/files/*.csv' 的所有CSV文件路径
    file_paths = glob.glob('path/to/csv/files/*.csv')

这段代码会自动收集指定目录中的所有CSV文件到列表file_paths中,无需手动操作。

先来读取并合并 CSV 文件

接下来,我们将使用 csv 模块来读取这些文件的内容,并将它们合并成一个数据集。这里是如何做到这一点的方法:

    导入csv  

    合并数据 = []  

    对于每个文件路径 file_paths 中的文件:  
        以读取模式打开文件,并将其作为 csvfile:  
            创建一个 csv.reader 对象 reader 来读取 csvfile  
            对于 reader 中的每一行 row:  
                将这一行添加到合并数据中

在这个示例中,我们打开每个CSV文件,使用csv.reader读取每份文件的内容,并将每一行添加到combined_data列表。这种方法避免了一次性将整个文件加载到内存中,从而更加节省内存空间。

步骤 3:处理合并后的数据

一旦所有文件被读取并将内容合并后,您可以根据项目需求处理 combined_data 列表中的数据。此方法对于数据清理、转换或分析等任务特别有用。

掌握Pandas的pivot_table()函数:探索数据重塑与分析的强大功能

照片由 Pau SayrolUnsplash 提供。

掌握pandas的apply()函数,实现高效数据处理 | 学习如何灵活运用pandas的apply()函数进行数据转换](https://python.plainenglish.io/mastering-pandas-apply-for-efficient-data-manipulation-a6ea0a548530?source=post_page-----03373b52166e--------------------------------)
Pandas 和 CSV 的性能对比

为了突出使用csv模块比Pandas更有效率,让我们从速度和内存使用两个方面比较这两种方法的性能表现。

速度基准测试

假设一个情况,我们有1,000个CSV文件,每个文件都有数千行记录。使用Pandas库,通常的方法可能是这样的,如下:

导入pandas库作为pd。
使用列表推导式从文件路径列表中读取CSV文件并生成数据帧列表。
使用pd.concat将所有数据帧合并为一个数据帧combined_df。

虽然这种方法简单直接,但是由于 Pandas 内部的大量操作会导致较高的开销。接下来,我们来比较一下这种方法与之前使用 csv 模块的方法。

    import csv  

    # 定义一个空列表来存储组合后的数据
    combined_data = []  

    # 遍历文件路径列表
    for file in file_paths:  
        # 打开文件并读取数据
        with open(file, mode='r') as csvfile:  
            reader = csv.reader(csvfile)  
            # 将每一行数据添加到combined_data列表中
            for row in reader:  
                combined_data.append(row)
注意:file_paths 变量应事先定义,它包含所有需要读取的文件路径。

在各种基准测试中,csv 模块通常优于 Pandas,在需要更高原始速度和更低内存使用的关键场景中尤其如此,尤其是当需要处理多个文件时。例如,在同时读取多个大文件的情况下。

内存使用情况对比

Pandas 会将整个数据集加载到内存中,按设计。处理大文件时可能会非常消耗内存。另一方面,csv 模块逐行读取数据,形成块。这从而大大减少了内存使用。这使得它更适合在内存有限的环境中运行的应用程序或处理非常大的数据集。

NumPy 数组 vs Python 列表:探究差异
基于何时使用Pandas和CSV模块之间的选择

尽管csv模块在速度和内存效率方面提供了显著的优势,但在某些情况下使用Pandas仍然是更好的选择。这里有一个快速指南,说明在什么情况下使用每个工具:

  • 如果你需要更高级的数据操作和分析功能,建议使用Pandas。
  • 如果你只需要基本的CSV文件读写操作,并且希望程序运行得更快、占用更少的内存,那么使用csv模块会更合适。
当需要使用Pandas时:
  • 你需要超越简单读写的数据操作和分析能力。
  • 你的数据集可以轻松地放入内存中,并且处理速度并不是最重要的考量。
  • 你需要使用Pandas特有的功能,如合并、分组或转置数据。
在以下情况下使用 CSV 模块:
  • 你正在处理非常大的数据集,这些数据集一次无法全部加载到内存中。
  • 你需要尽量减少开销。
  • 你的任务主要是读取和合并数据,对复杂转换的需求不大。

了解每种方法的优点和限制将帮助您选择适合您特定需求的工具,确保您的数据处理任务高效且有效。

如何在Python中使用NumPy的rand()和randint()生成随机数

注:rand(): 生成0到1之间的随机数,randint(): 生成指定范围内的随机整数

如何自定义CSV解析器和处理数据

尽管 csv 模块轻量级且高效,它还提供了自定义的灵活性。允许你根据特定需求自定义 CSV 读取过程。本节将探讨如何通过创建自定义解析器并将数据处理直接集成到 CSV 读取过程来扩展 csv 模块的功能。

自定义解析器:搞定复杂CSV结构

在实际场景中,CSV 文件可能并不总是那么直接。它们可能包含嵌套结构,使用不规则的分隔符,或有各种数据格式。好在,csv 模块允许你定义自定义解析器来应对这些复杂情况。

例如,假设你有一些个使用分号 (;) 作为分隔符的 CSV 文件,并且字段中在引号内的字符串包含逗号。你可以自定义相应的 CSV 读取器来应对这种情况。

    import csv  

    with open('path/to/complex_file.csv', mode='r') as csvfile:  # 以只读模式打开
        reader = csv.reader(csvfile, delimiter=';', quotechar='"')  
        for row in reader:  
            # 每行的处理
            # 打印每一行数据
            print(row)

这段代码示例展示了如何修改 delimiterquotechar 参数来正确解析更复杂的 CSV 格式。你可以进一步通过实现自定义解析逻辑来处理更特殊的需求或情况。

数据处理整合

使用 csv 模块的另一个好处是可以在读取过程中直接进行数据处理。这种方法特别适合在不需要先将整个数据集加载到内存中时,处理数据时实时过滤、转换或聚合数据。

例如,如果你想根据特定的条件过滤行(例如,仅包含那些特定列满足条件的行),你可以在读取CSV文件时这样做。

    import csv  

    filtered_data = []  # 过滤后的数据列表

    with open('path/to/filtered_file.csv', mode='r') as csvfile:  
        reader = csv.reader(csvfile)  
        for row in reader:  
            # 这里我们假设条件是在第三列
            if int(row[2]) > 100:  
                filtered_data.append(row)

这里是一个读取CSV文件并过滤数据的Python代码示例:

这种方法不仅简化了数据处理流程,还确保内存使用保持较低,只保留相关数据。

NumPy 数组的复制与视图:优化 NumPy 数组的内存和性能

照片由 engin akyurtUnsplash 拍摄

10 个必备的 Seaborn 数据可视化
处理大型CSV文件,使用生成器

当处理过于庞大的 CSV 文件,这些文件太大无法一次性加载到内存时,可以通过生成器进一步优化 Python 的 csv 模块。生成器允许你按需处理数据,这意味着数据仅在需要时才被读取,而不是一次性全部加载到内存。

使用生成器节省内存

而不是直接将行追加到列表中,你可以创建一个生成器函数,每次读取文件中的每一行时就生成它。这样,你可以高效地处理大型 CSV 文件,而不会占用过多的系统内存。

这里是一个使用生成器来读取一个大型CSV文件的示例。

    import csv  

    def csv_generator(file_path):  
        with open(file_path, mode='r') as csvfile:  
            reader = csv.reader(csvfile)  
            for row in reader:  
                yield row  

    # 使用生成器逐行读取并处理CSV文件  
    for row in csv_generator('path/to/large_file.csv'):  
        # 处理每一行(例如打印或保存)  
        print(row)

在这个例子中,csv_generator 按需读取文件,每次只读取并生成一行。这种方法大大减少内存使用,非常适合处理非常大的数据集,因为一次性全部加载到内存中是不现实的。

使用多个文件的生成器

您也可以扩展生成器模式来处理多个CSV文件,而不必一次性加载所有文件到内存中。通过结合文件处理和生成器的功能,您可以依次处理每个文件,同时保持较低的内存使用。

    import csv  
    import glob  

    def multi_csv_generator(file_paths):  
        for file in file_paths:  
            with open(file, mode='r') as csvfile:  
                reader = csv.reader(csvfile)  
                for row in reader:  
                    yield row  

    # 这是一个处理多个CSV文件的示例  
    file_paths = glob.glob('path/to/csv/files/*.csv')  

    for row in multi_csv_generator(file_paths):  
        # 处理每个CSV文件中的每行数据  
        print(row)

在此设置中,multi_csv_generator 一次一行地读取多个 CSV 文件,并进行处理而不必将所有数据加载到内存中。这对于数据流、ETL(提取、转换、加载)过程或实时数据分析等任务特别有用,特别是在这些具体任务场景中。

掌握Python:浅复制 vs 深复制学习浅复制和深复制如何工作,它们之间有何不同以及使用场景。
结论部分

当涉及到处理大规模数据集或在性能关键的应用程序中工作时,仅仅依赖于Pandas的read_csv方法有时会带来效率问题。虽然Pandas在数据操作和分析方面表现出色,其内存开销和较慢的处理速度在处理多个CSV文件或受限环境时可能会成为限制因素。

通过使用 Python 内置的 csv 模块,你可以高效地读取和处理多个 CSV 文件,而无需使用迭代循环。这种方法不仅节省了内存,还提高了性能,使其成为实时数据管道、大型数据集或资源有限系统中的理想选择场景。此外,通过使用自定义解析器、数据处理技术以及生成器,csv 模块提供了足够的灵活性来应对复杂的文件结构和大规模的数据。

知道何时使用Pandas和何时选择更轻量级的替代方案(如csv模块)是编写高效且可扩展代码的关键。通过应用本文中提到的策略,开发人员和数据工程师可以优化其工作流程,确保应用程序保持快速、高效且健壮。

感谢您的阅读,祝您编程顺利!

记得总是要进行自己的研究并核实你遇到的信息。仅依赖他人这可能会让你采用一些过时或不正确的做法。主动实施并优化你找到的代码,确保它符合你的实际需求和标准。

掌握Python取余、向下取整除、取模和幂运算 学习Python中的取余、向下取整除、取模和幂运算技巧

这张照片由 Rowen Smith 拍摄,来自 Unsplash。

最后说一句:

谢谢您抽空读我的文章。

这篇文章首先发布在Medium上,CyCoderX发布。

嘿朋友们!我是CyCoderX,一名爱数据的工程师,喜欢从头到尾解决问题。我写的文章涉及PythonSQLAI数据工程生活方式还有更多!

如果你想要看看类似的文章和最新动态,可以随便看看我的 Medium 账号—

CyCoderX

CyCoderX

Python小贴士:CyCoderX

查看列表 →

72个小故事

加入我一起探索激动人心的技术领域,数据以及更多领域!一起来吧!
技术
数据
更多领域

你对这篇文章有什么看法?在下面的评论区告诉我,看你的设备是横屏还是竖屏啦!看你设备怎么放置,是在上面还是下面留言哦🙃

你可以通过以下方式支持我
  1. 为这个故事鼓掌50下
  2. 在评论区告诉我你的想法
  3. 标注你最喜欢的部分吧
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消