Python教程:高效地将CSV行拆分为独立文件并处理重复命名

Python教程:高效地将CSV行拆分为独立文件并处理重复命名

本教程将指导您如何使用Python从一个CSV文件中的每一行数据生成独立的CSV文件。我们将探讨如何正确地使用csv.writer处理字段分隔,并进一步介绍如何利用contextlib.ExitStack和字典来管理多个输出文件,有效避免因文件名重复而导致的数据覆盖问题,确保数据的完整性和处理效率。

1. 任务概述与常见挑战

在数据处理场景中,我们经常需要将一个大型csv文件拆分为多个小型、结构化的csv文件。例如,给定一个包含“订单号”、“日期”和“文件名”的csv文件,目标是根据“文件名”字段为每一行数据创建一个独立的csv文件,且每个新文件只包含“订单号”和“日期”字段,不含表头。

初学者在尝试实现此功能时,常遇到的一个挑战是,直接使用文件对象的write()方法来写入字段时,如果不对字段进行明确的分隔,会导致所有字段连接成一个字符串,而不是标准的CSV格式(即逗号分隔值)。例如,将row[‘Order Number’]和row[‘Date’]直接写入文件,结果会是123452023-01-01,而不是12345,2023-01-01。

2. 基本解决方案:使用csv.writer正确生成独立CSV文件

Python的csv模块提供了处理CSV数据的强大功能。要正确地将字段写入CSV文件并用逗号分隔,应使用csv.writer对象及其writerow()方法。

以下是实现这一基本功能的代码示例:

import csv# 假设输入CSV文件名为 TestExport.csv,包含 'Order Number', 'Date', 'File Name' 三列input_csv_path = "//server2/shared/Data/TestExport.csv"try:    with open(input_csv_path, 'r', encoding='utf-8') as in_f:        reader = csv.DictReader(in_f)        for row in reader:            # 根据 'File Name' 字段构造输出文件名            file_name = '{0}.csv'.format(row['FileName'])            # 使用 'w' 模式打开文件,并指定 newline='',这是 csv.writer 的必要条件            # 默认使用逗号作为分隔符            with open(file_name, 'w', newline='', encoding='utf-8') as out_f:                writer = csv.writer(out_f, delimiter=',')                # 写入 'Order Number' 和 'Date' 字段,writerow 会自动处理分隔符和换行                writer.writerow([row['Order Number'], row['Date']])    print("基本文件拆分完成。")except FileNotFoundError:    print(f"错误:输入文件 '{input_csv_path}' 未找到。请检查文件路径。")except Exception as e:    print(f"处理过程中发生错误: {e}")

代码解析:

立即学习“Python免费学习笔记(深入)”;

import csv: 导入Python内置的csv模块。csv.DictReader(in_f): 创建一个字典读取器。它将CSV文件的每一行读取为字典,其中键是列标题(即表头)。file_name = ‘{0}.csv’.format(row[‘FileName’]): 从当前行的’FileName’字段获取值,并格式化为新的CSV文件名。open(file_name, ‘w’, newline=”, encoding=’utf-8′):’w’模式表示写入(如果文件存在则覆盖)。newline=”对于csv.writer至关重要,它防止在Windows系统上写入额外的空行,并确保跨平台的正确性。encoding=’utf-8’是处理多种字符集的好习惯,建议明确指定。csv.writer(out_f, delimiter=’,’): 创建一个CSV写入器对象。delimiter=’,’明确指定了字段之间的分隔符为逗号。writer.writerow([row[‘Order Number’], row[‘Date’]]): 这是核心操作。writerow()方法接收一个列表作为参数,列表中的每个元素将作为一个字段写入CSV行,并由指定的分隔符分隔,最后自动添加换行符。

3. 高级场景:处理重复文件名和优化文件管理

上述基本解决方案在处理源CSV文件中存在多个行对应相同“文件名”的情况时,会遇到一个问题:每次遇到相同的file_name,open(file_name, ‘w’, …)都会重新创建并覆盖现有文件,导致只有最后一行数据被保留。

为了解决这个问题,我们需要:

维护一个已打开文件(或其对应的csv.writer)的映射,以便在遇到相同文件名时重用。确保所有打开的文件在程序结束时都能被正确关闭,即使存在多个文件句柄。

contextlib.ExitStack是一个非常有用的上下文管理器,它允许我们在一个with语句块中管理多个上下文,并在该块结束时统一清理(如关闭所有文件)。

以下是处理重复文件名并优化文件管理的解决方案:

import csvimport contextlibinput_csv_path = "//server2/shared/Data/TestExport.csv"try:    with open(input_csv_path, 'r', encoding='utf-8') as in_f:        # writers 字典用于存储已创建的 csv.writer 对象,键为文件名        writers = {}  # type: dict[str, csv.writer]        # 使用 ExitStack 来管理多个文件句柄,确保它们在块结束时被关闭        with contextlib.ExitStack() as stack:            reader = csv.DictReader(in_f)            for row in reader:                file_name = '{0}.csv'.format(row['FileName'])                # 尝试从 writers 字典获取当前文件名的 writer                writer = writers.get(file_name)                # 如果还没有为这个文件名创建 writer                if writer is None:                    # 使用 stack.enter_context 打开新文件                    # 这会将文件句柄添加到 ExitStack 的管理列表中,确保其在退出时关闭                    out_f = stack.enter_context(open(file_name, 'w', newline='', encoding='utf-8'))                    # 创建新的 csv.writer 并存储到字典中                    writer = csv.writer(out_f, delimiter=',')                    writers[file_name] = writer                    # 首次写入时,可以选择性地添加表头                    # writer.writerow(['OrderNumber', 'Date']) # 根据需求决定是否需要表头                # 写入数据行                writer.writerow([row['Order Number'], row['Date']])    print("高级文件拆分完成,已处理重复文件名。")except FileNotFoundError:    print(f"错误:输入文件 '{input_csv_path}' 未找到。请检查文件路径。")except Exception as e:    print(f"处理过程中发生错误: {e}")

代码解析:

立即学习“Python免费学习笔记(深入)”;

import contextlib: 导入contextlib模块。writers = {}: 创建一个空字典writers。它的键将是输出文件名,值是对应的csv.writer对象。with contextlib.ExitStack() as stack:: 这是一个关键部分。ExitStack允许我们动态地进入(enter_context)和退出多个上下文管理器。当with stack:块结束时,ExitStack会自动调用所有已进入上下文管理器的__exit__方法,从而关闭所有文件。writer = writers.get(file_name): 尝试从writers字典中获取与当前file_name关联的writer。如果不存在,writer将为None。if writer is None:: 如果是第一次遇到这个file_name,则:out_f = stack.enter_context(open(file_name, ‘w’, newline=”, encoding=’utf-8′)): 打开新的输出文件。stack.enter_context()的作用是将open()返回的文件句柄添加到ExitStack的管理中。writer = csv.writer(out_f): 创建新的csv.writer。writers[file_name] = writer: 将新创建的writer存储到writers字典中,以便后续重用。writer.writerow([‘OrderNumber’, ‘Date’]): 这是一个可选步骤。如果需要为每个独立文件添加表头,可以在文件首次创建时写入。writer.writerow([row[‘Order Number’], row[‘Date’]]): 无论是新创建的还是重用的writer,都用于写入当前行的数据。

4. 注意事项与最佳实践

文件路径: 确保输入文件路径正确无误。输出文件默认会创建在脚本运行的当前目录下,或者您可以指定一个完整的输出路径。编码: 在打开文件时始终明确指定encoding,推荐使用’utf-8’,以避免字符编码问题。错误处理: 使用try-except块来捕获FileNotFoundError或其他潜在的IO错误,增强程序的健壮性。内存使用: 对于非常大的输入CSV文件,如果输出文件数量也非常庞大,可能会同时打开大量文件。虽然ExitStack能妥善管理关闭,但操作系统对同时打开的文件句柄数量有限制。对于极端情况,可能需要考虑更复杂的策略,例如批量处理或分批写入。表头处理: 根据您的需求,决定是否在每个拆分出的CSV文件中包含表头。如果需要,请在首次写入文件时添加。

5. 总结

本教程详细介绍了如何使用Python的csv模块将一个CSV文件的行拆分为多个独立的CSV文件。我们首先学习了使用csv.writer和writerow()方法来正确处理字段分隔,避免了直接f.write()导致的格式问题。随后,我们通过引入contextlib.ExitStack和writers字典,解决了在处理重复文件名时数据被覆盖的问题,实现了更健壮和高效的文件管理。掌握这些技术将帮助您更灵活地处理和转换CSV数据。

以上就是Python教程:高效地将CSV行拆分为独立文件并处理重复命名的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1372556.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Llama Index 自定义嵌入:深入理解查询与文本向量化方法的差异与实践
上一篇 2025年12月14日 12:25:07
WooCommerce API v3 产品评论:添加与自定义元数据限制解析
下一篇 2025年12月14日 12:25:17

相关推荐

  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    100
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    100
  • 怎么在PHP代码中实现图片上传功能_PHP图片上传功能实现与安全处理教程

    首先创建含enctype的HTML表单,再用PHP接收文件,检查目录、移动临时文件,验证类型与大小,生成唯一文件名,并调整php.ini限制以确保上传成功。 如果您尝试在PHP项目中添加图片上传功能,但服务器无法正确接收或保存文件,则可能是由于表单配置、文件处理逻辑或安全限制的问题。以下是实现该功能…

    2026年5月10日
    100
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • RichHandler与Rich Progress集成:解决显示冲突的教程

    在使用rich库的`richhandler`进行日志输出并同时使用`progress`组件时,可能会遇到显示错乱或溢出问题。这通常是由于为`richhandler`和`progress`分别创建了独立的`console`实例导致的。解决方案是确保日志处理器和进度条组件共享同一个`console`实例…

    2026年5月10日
    000
  • 修复点击时按钮抖动:CSS垂直对齐实践

    本文探讨了在Web开发中,交互式按钮(如播放/暂停按钮)在点击时发生意外垂直位移的问题。通过分析CSS样式变化对元素布局的影响,我们发现这是由于按钮不同状态下的边框样式和内边距改变,以及默认的垂直对齐行为共同作用所致。核心解决方案是利用CSS的vertical-align属性,将其设置为middle…

    2026年5月10日
    100
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • 使用 WebCodecs VideoDecoder 实现精确逐帧回退

    本文档旨在解决在使用 WebCodecs VideoDecoder 进行视频解码时,实现精确逐帧回退的问题。通过比较帧的时间戳与目标帧的时间戳,可以避免渲染中间帧,从而提高用户体验。本文将提供详细的解决方案和示例代码,帮助开发者实现精确的视频帧控制。 在使用 WebCodecs VideoDecod…

    2026年5月10日
    000
  • PHP动态生成表单输入与POST数据获取实践指南

    本教程详细阐述了如何在php中根据动态数据源(如数据库值)生成多个表单输入框,并演示了如何通过post方法准确无误地获取这些动态生成的输入值。文章强调了正确的输入框命名策略,避免了常见的命名误区,并提供了完整的代码示例,确保开发者能够高效处理动态表单数据。 动态生成表单输入 在Web开发中,我们经常…

    2026年5月10日
    000
  • Python递归函数追踪与性能考量:以序列打印为例

    本文深入探讨了Python中一种递归打印序列元素的方法,并着重演示了如何通过引入缩进参数来有效追踪递归函数的执行流程和参数变化。通过实际代码示例,文章揭示了递归调用可能带来的潜在性能开销,特别是对调用栈空间的需求,以及Python默认递归深度限制可能导致的错误,为读者提供了理解和优化递归算法的实用见…

    2026年5月10日
    000
  • python中zip函数详解 python多序列压缩zip函数应用场景

    zip函数的应用场景包括:1) 同时遍历多个序列,2) 合并多个列表的数据,3) 数据分析和科学计算中的元素运算,4) 处理csv文件,5) 性能优化。zip函数是一个强大的工具,能够简化代码并提高处理多个序列时的效率。 在Python中,zip函数是一个非常有用的工具,它能够将多个可迭代对象打包成…

    2026年5月10日
    000
  • c++如何实现UDP通信_c++基于UDP的网络通信示例

    UDP通信基于套接字实现,适用于实时性要求高的场景。1. 流程包括创建套接字、绑定地址(接收方)、发送(sendto)与接收(recvfrom)数据、关闭套接字;2. 服务端监听指定端口,接收客户端消息并回传;3. 客户端发送消息至服务端并接收响应;4. 跨平台需处理Winsock初始化与库链接,编…

    2026年5月10日
    100
  • html5怎么画实线_HTML5用CSS border-style:solid画元素实线边框【绘制】

    可通过CSS的border-style属性设为solid添加实线边框:一、内联样式用border:2px solid #000;二、内部样式表统一设置如div{border:1px solid #333};三、外部CSS文件定义.my-box{border:3px solid red}并引入;四、单…

    2026年5月10日
    200
  • 谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    使用谷歌浏览器的开发者工具截图步骤:1. 按ctrl+shift+i(windows/linux)或cmd+option+i(mac)打开开发者工具。2. 点击右上角三个点,选择”更多工具”,再选择”截图”。3. 选择截取整个页面。推荐的谷歌浏览器扩展…

    2026年5月10日 用户投稿
    100
  • Python中怎样使用pymongo?

    在python中使用pymongo可以轻松地与mongodb数据库进行交互。1)安装pymongo:pip install pymongo。2)连接到mongodb:from pymongo import mongoclient; client = mongoclient(‘mongod…

    2026年5月10日
    000
  • JS如何实现迭代器?迭代器协议

    JavaScript中实现迭代器需遵循可迭代协议和迭代器协议,通过定义[Symbol.iterator]方法返回具备next()方法的迭代器对象,从而支持for…of和展开运算符;该机制统一了数据结构的遍历接口,实现惰性求值,适用于自定义对象、树、图及无限序列等复杂场景,提升代码通用性与…

    2026年5月10日
    100
  • 使用 Pydantic v2 实现条件性必填字段

    本文介绍了如何在 Pydantic v2 模型中实现条件性必填字段。通过自定义验证器,可以根据模型中其他字段的值来动态地控制某些字段是否为必填项,从而满足 API 交互中数据验证的复杂需求。本文提供了一个具体的示例,展示了如何确保模型中至少有一个字段被赋值。 在 Pydantic v2 中,虽然没有…

    2026年5月10日
    000
  • 如何讲html和css_讲解HTML与CSS结合使用基础【基础】

    需将HTML与CSS结合使用以实现网页结构与样式的分离:HTML定义标题、段落等语义结构,CSS控制颜色、字体等外观;可通过内联样式、内部样式表或外部CSS文件引入样式,并利用类选择器和ID选择器精准应用。 如果您希望网页不仅展示内容,还能具备基本的样式和结构布局,则需要将HTML与CSS结合使用。…

    2026年5月10日
    100
  • React组件中动态属性值的管理与同步:利用状态实现受控组件

    本教程旨在解决react组件中动态属性值同步使用的问题。我们将探讨如何利用react的`usestate` hook来管理组件内部状态,从而实现一个属性的值动态地影响另一个属性,并构建出可预测、易于维护的受控组件。文章将通过具体代码示例,详细阐述从初始化状态到处理状态更新的完整过程,并强调受控组件在…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信