使用Python将CSV文件按行拆分为多个独立文件并妥善管理

使用python将csv文件按行拆分为多个独立文件并妥善管理

本文详细介绍了如何使用Python的csv模块将一个大型CSV文件中的每一行数据拆分并写入到单独的CSV文件中。核心内容包括利用csv.writer正确处理CSV格式,以及通过contextlib.ExitStack和字典管理多个文件写入器,以高效、健壮地解决文件名冲突和资源管理问题,确保数据准确无误地分散到指定的新文件中。

1. CSV数据拆分与写入基础

在Python中处理CSV文件时,如果需要将原始文件中的每一行或特定行的数据提取出来,并保存到以行内容命名的独立CSV文件中,一个常见的需求是将特定字段作为新文件的文件名,并将其他字段写入到这个新文件中。

假设我们有一个包含Order Number、Date和File Name三列的CSV文件,目标是为每一行创建一个新的CSV文件,文件名取自File Name字段,新文件中只包含Order Number和Date字段,且不带表头。

最初尝试可能直接使用f.write()方法将字段内容写入文件。然而,这种方法存在一个核心问题:f.write()仅仅是写入字符串,它不会自动添加CSV文件所需的字段分隔符(如逗号)。这会导致所有字段内容被连接成一个单一的字符串,而不是以逗号分隔的多个字段。

错误示例(仅供理解问题,不建议使用):

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

import csv# 假设TestExport.csv存在于指定路径# with open("//server2/shared/Data/TestExport.csv",'r') as csvfile:#         reader = csv.DictReader(csvfile)#         for row in reader:#             file_name ='{0}.csv'.format(row['FileName'])#             with open(file_name, 'w') as f:#                    f.write(row['Order Number'])#                    f.write(row['Date'])

上述代码的问题在于f.write(row[‘Order Number’])和f.write(row[‘Date’])会将两个字符串直接连接起来,例如123452023-01-01,而不是12345,2023-01-01。

2. 使用csv.writer正确写入CSV数据

解决上述问题的关键在于使用Python内置csv模块提供的csv.writer对象。csv.writer专门用于处理CSV格式的写入,它能够自动处理字段分隔符和行结束符。

核心改进点:

csv.writer(out_f, delimiter=’,’): 创建一个CSV写入器,并指定逗号作为字段分隔符。writer.writerow([…]): 使用此方法写入一行数据。它接受一个列表作为参数,列表中的每个元素将作为一个字段写入,并自动添加分隔符。newline=”: 在打开文件时,对于csv.writer,必须指定newline=”。这是因为csv模块会自行处理换行符,如果Python的默认换行转换机制也介入,可能会导致文件中出现双重换行,或在不同操作系统间产生兼容性问题。

正确实现示例:

import csv# 假设TestExport.csv是你的源文件source_csv_path = "//server2/shared/Data/TestExport.csv"with open(source_csv_path, 'r', encoding='utf-8') as in_f: # 建议指定编码    reader = csv.DictReader(in_f)    for row in reader:        # 根据'FileName'字段生成新CSV的文件名        file_name = '{0}.csv'.format(row['FileName'])        # 以写入模式打开新文件,并指定newline=''        with open(file_name, 'w', newline='', encoding='utf-8') as out_f: # 建议指定编码            # 创建csv写入器,指定逗号为分隔符            writer = csv.writer(out_f, delimiter=',')            # 写入Order Number和Date字段。writerow接受一个列表            writer.writerow([row['Order Number'], row['Date']])print("所有行已成功拆分并写入独立CSV文件。")

这段代码能够正确地将每一行数据拆分并写入到各自的CSV文件中,每个新文件只包含Order Number和Date两个字段,并以逗号分隔。

3. 处理文件名冲突与资源管理:使用contextlib.ExitStack

上述解决方案虽然正确,但存在一个潜在问题:如果源CSV文件中有两行或多行具有相同的File Name字段值,那么后一行的数据将覆盖前一行的数据,因为每次循环都会重新打开并清空同名文件。此外,频繁地打开和关闭文件也可能影响性能。

为了解决这个问题,我们可以采用更高级的策略:

复用写入器: 使用一个字典来存储已经创建的csv.writer对象。当遇到一个已存在文件名的行时,直接使用字典中对应的写入器追加数据,而不是重新创建文件。统一文件管理: 由于我们会打开多个文件并保持它们处于打开状态以供复用,我们需要一种机制来确保所有这些文件最终都能被正确关闭。contextlib.ExitStack是处理这种情况的理想工具。它允许你在一个with语句块中管理多个上下文管理器(如文件对象),并在with块结束时自动关闭所有被管理的资源。

健壮的解决方案示例:

import csvimport contextlibsource_csv_path = "//server2/shared/Data/TestExport.csv"with open(source_csv_path, 'r', encoding='utf-8') as in_f:    # writers字典用于存储每个文件对应的csv.writer对象    # 键是文件名,值是对应的csv.writer实例    writers = {}    # 使用ExitStack来管理所有打开的文件对象    with contextlib.ExitStack() as stack:        reader = csv.DictReader(in_f)        for row in reader:            file_name = '{0}.csv'.format(row['FileName'])            # 尝试从writers字典中获取当前文件名的写入器            writer = writers.get(file_name)            # 如果该文件名的写入器尚未创建            if writer is None:                # 使用stack.enter_context()打开新文件。                # ExitStack会负责在with块结束时关闭此文件。                out_f = stack.enter_context(open(file_name, 'w', newline='', encoding='utf-8'))                # 创建新的csv写入器并存储到writers字典中                writer = csv.writer(out_f)                writers[file_name] = writer                # (可选)为新创建的文件写入表头                # 如果不需要表头,可以删除下面这行                writer.writerow(['OrderNumber', 'Date'])            # 使用获取到的(或新创建的)写入器写入数据行            writer.writerow([row['Order Number'], row['Date']])print("所有行已成功拆分并写入独立CSV文件,重复文件名的数据已追加。")

4. 代码详解与注意事项

contextlib.ExitStack: 这是一个强大的上下文管理器。通过stack.enter_context(resource),你可以将任何上下文管理器(如open()返回的文件对象)注册到ExitStack中。当最外层的with contextlib.ExitStack() as stack:块结束时,无论以何种方式(正常退出、异常),ExitStack都会确保所有注册的资源按LIFO(后进先出)顺序被正确关闭。这避免了手动管理多个文件句柄的复杂性。writers 字典: 这个字典是实现写入器复用的关键。它将文件名映射到对应的csv.writer对象。当处理一行数据时,程序首先检查writers中是否已有该文件名的写入器。如果没有,就创建一个新的文件和写入器,并将其添加到字典中;如果已经存在,则直接使用已有的写入器进行写入。可选的表头写入: 在if writer is None:块中,我们可以在文件首次被创建时写入一个表头(writer.writerow([‘OrderNumber’, ‘Date’]))。这确保了每个新生成的CSV文件都有一个清晰的表头,并且表头只会被写入一次。如果不需要表头,可以删除这行代码。编码(encoding=’utf-8’): 在打开文件时,显式指定编码是一个好习惯,尤其是处理包含非ASCII字符的数据时,utf-8是推荐的通用编码。性能: 相比于每次循环都打开和关闭文件,使用ExitStack和写入器复用可以显著提高处理大量数据时的性能,因为它减少了文件I/O操作的开销。

总结

通过本教程,我们学习了如何使用Python的csv模块将一个CSV文件按行拆分为多个独立的CSV文件。从基础的csv.writer使用到更高级的contextlib.ExitStack和字典组合,我们解决了文件名冲突和资源管理问题,确保了数据拆分过程的准确性、健壮性和高效性。掌握这些技术将帮助你在处理CSV数据时更加灵活和专业。

以上就是使用Python将CSV文件按行拆分为多个独立文件并妥善管理的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 12:26:16
下一篇 2025年12月14日 12:26:33

相关推荐

  • 如何解决本地图片在使用 mask JS 库时出现的跨域错误?

    如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…

    2025年12月24日
    200
  • 使用 Mask 导入本地图片时,如何解决跨域问题?

    跨域疑难:如何解决 mask 引入本地图片产生的跨域问题? 在使用 mask 导入本地图片时,你可能会遇到令人沮丧的跨域错误。为什么会出现跨域问题呢?让我们深入了解一下: mask 框架假设你以 http(s) 协议加载你的 html 文件,而当使用 file:// 协议打开本地文件时,就会产生跨域…

    2025年12月24日
    200
  • Bear 博客上的浅色/深色模式分步指南

    我最近使用偏好颜色方案媒体功能与 light-dark() 颜色函数相结合,在我的 bear 博客上实现了亮/暗模式切换。 我是这样做的。 第 1 步:设置 css css 在过去几年中获得了一些很酷的新功能,包括 light-dark() 颜色函数。此功能可让您为任何元素指定两种颜色 &#8211…

    2025年12月24日
    100
  • 如何在 Web 开发中检测浏览器中的操作系统暗模式?

    检测浏览器中的操作系统暗模式 在 web 开发中,用户界面适应操作系统(os)的暗模式设置变得越来越重要。本文将重点介绍检测浏览器中 os 暗模式的方法,从而使网站能够针对不同模式调整其设计。 w3c media queries level 5 最新的 web 标准引入了 prefers-color…

    2025年12月24日
    000
  • 如何使用 CSS 检测操作系统是否处于暗模式?

    如何在浏览器中检测操作系统是否处于暗模式? 新发布的 os x 暗模式提供了在 mac 电脑上使用更具沉浸感的用户界面,但我们很多人都想知道如何在浏览器中检测这种设置。 新标准 检测操作系统暗模式的解决方案出现在 w3c media queries level 5 中的最新标准中: 立即学习“前端免…

    2025年12月24日
    000
  • 如何检测浏览器环境中的操作系统暗模式?

    浏览器环境中的操作系统暗模式检测 在如今科技的海洋中,越来越多的设备和软件支持暗模式,以减少对眼睛的刺激并营造更舒适的视觉体验。然而,在浏览器环境中检测操作系统是否处于暗模式却是一个令人好奇的问题。 检测暗模式的标准 要检测操作系统在浏览器中是否处于暗模式,web 开发人员可以使用 w3c 的媒体查…

    2025年12月24日
    200
  • 浏览器中如何检测操作系统的暗模式设置?

    浏览器中的操作系统暗模式检测 近年来,随着用户对夜间浏览体验的偏好不断提高,操作系统已开始引入暗模式功能。作为一名 web 开发人员,您可能想知道如何检测浏览器中操作系统的暗模式状态,以相应地调整您网站的设计。 新 media queries 水平 w3c 的 media queries level…

    2025年12月24日
    000
  • 正则表达式在文本验证中的常见问题有哪些?

    正则表达式助力文本输入验证 在文本输入框的验证中,经常遇到需要限定输入内容的情况。例如,输入框只能输入整数,第一位可以为负号。对于不会使用正则表达式的人来说,这可能是个难题。下面我们将提供三种正则表达式,分别满足不同的验证要求。 1. 可选负号,任意数量数字 如果输入框中允许第一位为负号,后面可输入…

    2025年12月24日
    000
  • 我在学习编程的第一周学到的工具

    作为一个刚刚完成中学教育的女孩和一个精通技术并热衷于解决问题的人,几周前我开始了我的编程之旅。我的名字是OKESANJO FATHIA OPEYEMI。我很高兴能分享我在编码世界中的经验和发现。拥有计算机科学背景的我一直对编程提供的无限可能性着迷。在这篇文章中,我将反思我在学习编程的第一周中获得的关…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 姜戈顺风

    本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

    2025年12月24日
    000
  • 花 $o 学习这些编程语言或免费

    → Python → JavaScript → Java → C# → 红宝石 → 斯威夫特 → 科特林 → C++ → PHP → 出发 → R → 打字稿 []https://x.com/e_opore/status/1811567830594388315?t=_j4nncuiy2wfbm7ic…

    2025年12月24日
    000
  • css怎么设置文件编码

    在css中,可以使用“@charset”规则来设置编码,语法格式“@charset “字符编码类型”;”。“@charset”规则可以指定样式表中使用的字符编码,它必须是样式表中的第一个元素,并且不能以任何字符开头。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • 响应式HTML5按钮适配不同屏幕方法【方法】

    实现响应式HTML5按钮需五种方法:一、CSS媒体查询按max-width断点调整样式;二、用rem/vw等相对单位替代px;三、Flexbox控制容器与按钮伸缩;四、CSS变量配合requestAnimationFrame优化的JS动态适配;五、Tailwind等框架的响应式工具类。 如果您希望H…

    2025年12月23日
    000
  • html5怎么导视频_html5用video标签导出或Canvas转DataURL获视频【导出】

    HTML5无法直接导出video标签内容,需借助Canvas捕获帧并结合MediaRecorder API、FFmpeg.wasm或服务端协同实现。MediaRecorder适用于WebM格式前端录制;FFmpeg.wasm支持MP4等格式及精细编码控制;服务端方案适合高负载场景。 如果您希望在网页…

    2025年12月23日
    300
  • 如何查看编写的html_查看自己编写的HTML文件效果【效果】

    要查看HTML文件的浏览器渲染效果,需确保文件以.html为扩展名保存、用浏览器直接打开、利用开发者工具调试、必要时启用本地HTTP服务器、或使用编辑器实时预览插件。 如果您编写了HTML代码,但无法直观看到其在浏览器中的实际渲染效果,则可能是由于文件未正确保存、未使用浏览器打开或文件扩展名设置错误…

    2025年12月23日
    400
  • html5怎么加php_html5用Ajax与PHP后端交互实现数据传递【交互】

    HTML5不能直接运行PHP,需通过Ajax与PHP通信:前端用fetch发送请求,PHP接收处理并返回JSON,前端解析响应更新DOM;注意跨域、编码、CSRF防护和输入过滤。 HTML5 本身是前端标记语言,不能直接运行 PHP 代码,但可以通过 Ajax(异步 JavaScript)与 PHP…

    2025年12月23日
    300
  • html5怎么设置单选_html5用input type=”radio”加name设单选按钮组【设置】

    HTML5 使用 type=”radio” 实现单选功能,需统一 name 值构成互斥组;通过 checked 设默认项;可用 CSS 隐藏原生控件并自定义样式;推荐用 fieldset/legend 增强语义;required 可实现必填验证。 如果您希望在网页中创建一组互…

    2025年12月23日
    200
  • node.js怎么运行html_node.js运行html步骤【指南】

    答案是使用Node.js内置http模块、Express框架或第三方工具serve可快速搭建服务器预览HTML文件。首先通过http模块创建服务器并读取index.html返回响应;其次用Express初始化项目并配置静态文件服务;最后利用serve工具全局安装后一键启动服务器,三种方式均在浏览器访…

    2025年12月23日
    300
  • html5怎么引用js_HTML5用外链或内嵌JS代码引用脚本【引用】

    HTML5中执行JavaScript需通过外链或内嵌方式引入:一、外链用,支持defer/async;二、内嵌将代码写入间,推荐置于body底部;三、type属性默认可省略;四、模块化使用type=”module”支持ES6 import/export。 <img sr…

    好文分享 2025年12月23日
    000

发表回复

登录后才能评论
关注微信