在 Python 中合并具有不同列的 CSV

2024-01-03

我有数百个大型 CSV 文件,我想将它们合并为一个。但是,并非所有 CSV 文件都包含所有列。因此,我需要根据列名称而不是列位置来合并文件。

需要明确的是:在合并的 CSV 中,对于来自不包含该单元格列的行的单元格,值应该为空。

我无法使用 pandas 模块,因为它使我内存不足。

是否有一个模块可以做到这一点,或者一些简单的代码?


The csv.DictReader and csv.DictWriter类应该运行良好(参见Python 文档 https://docs.python.org/3.4/library/csv.html#csv.DictReader)。像这样的事情:

import csv
inputs = ["in1.csv", "in2.csv"]  # etc

# First determine the field names from the top line of each input file
# Comment 1 below
fieldnames = []
for filename in inputs:
  with open(filename, "r", newline="") as f_in:
    reader = csv.reader(f_in)
    headers = next(reader)
    for h in headers:
      if h not in fieldnames:
        fieldnames.append(h)

# Then copy the data
with open("out.csv", "w", newline="") as f_out:   # Comment 2 below
  writer = csv.DictWriter(f_out, fieldnames=fieldnames)
  for filename in inputs:
    with open(filename, "r", newline="") as f_in:
      reader = csv.DictReader(f_in)  # Uses the field names in this file
      for line in reader:
        # Comment 3 below
        writer.writerow(line)

上面的评论:

  1. 您需要提前指定所有可能的字段名称DictWriter,因此您需要循环遍历所有 CSV 文件两次:一次查找所有标题,一次读取数据。没有更好的解决方案,因为之前需要知道所有标头DictWriter可以写第一行。这部分使用集合而不是列表会更有效(in列表上的运算符相对较慢),但对于几百个标头来说不会有太大区别。集合还会失去列表的确定性排序 - 每次运行代码时,列都会以不同的顺序出现。
  2. 上面的代码适用于 Python 3,其中 CSV 模块中会发生奇怪的事情,而无需newline=""。对于 Python 2,删除此选项。
  3. 在此刻,line是一个以字段名称作为键、以列数据作为值的字典。您可以指定如何处理空白或未知值DictReader and DictWriter构造函数。

此方法不应耗尽内存,因为它永远不会立即加载整个文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中合并具有不同列的 CSV 的相关文章

  • Python 类型提示 Dict 语法错误 可变默认值是不允许的。使用“默认工厂”

    我不知道为什么解释器会抱怨这个类型的字典 对于这两个实例 我得到一个 不允许可变默认值 使用默认工厂 语法错误 我使用的是 python 3 7 3 from dataclasses import dataclass from typing
  • 为什么 dataclasses.astuple 返回类属性的深层副本?

    在下面的代码中astuple函数正在执行数据类的类属性的深层复制 为什么它不能产生与函数相同的结果my tuple import copy import dataclasses dataclasses dataclass class Dem
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • 嵌套列表的重叠会产生不必要的间隙

    我有一个包含三个列表的嵌套 这些列表由 for 循环填充 并且填充由 if 条件控制 第一次迭代后 它可能类似于以下示例 a 1 2 0 0 0 0 0 0 4 5 0 0 0 0 0 0 6 7 根据条件 它们不重叠 在第二次迭代之后 新
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • 通过Python连接到Bigquery:ProjectId和DatasetId必须非空

    我编写了以下脚本来通过 SDK 将 Big Query 连接到 Python 如下所示 from google cloud import bigquery client bigquery Client project My First Pr
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 如何将 ascii 值列表转换为 python 中的字符串?

    我在 Python 程序中有一个列表 其中包含一系列数字 这些数字本身就是 ASCII 值 如何将其转换为可以在屏幕上回显的 常规 字符串 您可能正在寻找 chr gt gt gt L 104 101 108 108 111 44 32 1
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • 将索引与值交换的最快方法

    考虑pd Series s s pd Series list abcdefghij list ABCDEFGHIJ s A a B b C c D d E e F f G g H h I i J j dtype object 交换索引和值并
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • jars 似乎不再被签名。 JARSigningException:找到未签名的条目

    NB 7 4RC2 Win 7 在 Java 控制面板中 选中 保留临时 Internet 文件 复选框 我正在使用受信任的证书签署我的 Web Start 应用程序 然而 dist lib 中的第 3 方 jar 似乎未签名 C Prog
  • 更改代码后,PowerShell ISE 有时会出现不可预测的行为

    我正在使用 PowerShell ISE PS 版本 5 0 如果我运行这段代码 Write Host This 它输出 This 如果我像这样修改脚本 Write Host That 它输出 That 伟大的 正如预期的那样 现在 如果我
  • 无法在第二轮中将项目添加到集合中

    基本上我的 Windows 服务应用程序中有一个阻塞集合 每次我想向集合中添加 4 个项目然后对其进行处理 第一轮还好 第二轮就失败了 错误是 BlockingCollection 已被标记为已完成添加 My code public sta
  • Python - 以毫秒为单位的时间差对我不起作用

    我读过一些关于此的文章 并认为我有一些有效的代码 如果两个值之间的差异小于 1 秒 则显示的毫秒是正确的 如果差异超过一秒 它仍然只显示毫秒的差异 如下 Correct now wind 2013 08 25 08 43 04 776209
  • 在自己的数据集上训练 Tensorflow 对象检测

    在花了几天时间尝试完成这项任务之后 我想分享一下我如何回答这个问题的经验 我该如何使用TS 物体检测 https github com tensorflow models tree master research object detect
  • if (true) 的目的

    我见过一些这样写的代码 if true do something 你为什么要做这样的事情 这个结构有什么特别的地方吗 THanks 几乎任何现代编译器都会对此进行优化 我的猜测是 有人在开发过程中把它放在那里 让他们轻松删除代码块 通过更改
  • 如何防止argv中丢失双引号?

    好吧 我知道我可以这样循环 for int i 1 i lt argc 1 i cout lt lt argv i lt lt endl 但是这样双引号就丢失了 那就是一个字符串 something here 被视为 args 数组的一个元
  • 在绘图表达式中使用变量

    我试图将回归结果 即 R2 放入图表中 但似乎无法弄清楚如何从表达式中调用变量 它粘贴变量名称 这是我的代码 R2Val lt signif summary sMod pre90 r squared 1 2 text 92 4 expres
  • zsh compinit:安装 Homebrew 后,Mac 上出现不安全目录错误消息

    在我的 Mac 上安装 Homebrew 和 Homebrew Cask 后 以管理员身份 用户 ID 为 admin 运行 MacOS 10 12 6 我收到错误消息 zsh compinit insecure directories r
  • 发生整数溢出时无符号和有符号整数的行为差异[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从 iOS 7.1 到 iOS 8 发送数据时 BLE 花费太多时间

    我有一个奇怪的问题 我正在开发一个应用程序 我在其中发送20 20 字节的块 一切正常 当我发送字节数据时从 iOS 8 到 iOS 8设备从一个设备传输到另一个设备大约需要 4 5 秒 但我的问题是当我从iOS 7 1 至 iOS 8或者
  • 状态机;为什么只有最后一个状态有效?

    我有一个有 6 个状态 3 个主要状态 的状态机 只有最后一个状态有效 但前 2 个状态无效 共 3 个 只有最后一个状态有效 我发现了问题 当我移除去抖电路时它可以工作 但我需要去抖电路 我从网上得到了去抖电路 如果有人可以提供帮助 我会
  • 使用 RestSharp 将 JSON 数组反序列化为 C# 结构

    我使用 RestSharp 和动态地将不同的 JSON 结构转换为各种 C 结构IRestResponse
  • 使用 IMultiValueConverter 将多个命令参数传递给 viewModel

    我有以下代码
  • Haskell 列表中的连续数字

    我是 haskell 的新手 我正在尝试一些我之前为 java 完成的编码问题 但是下面的问题让我难住了 基本上 这个想法是编写一个接受整数列表 Int 的函数 确定整数列表中是否包含连续的 1 例如 以下内容的输出将是 输入 func 0
  • Xamarin.forms android权限提示不显示

    我正在使用权限插件 https github com jamesmontemagno PermissionsPlugin作者 詹姆斯 蒙特马尼奥 我基本上复制了该示例 但是在请求它的行之后权限未知 甚至没有对话框显示 var status
  • 通过 javascript 访问车把变量

    我正在为 Express js 框架生成一个把手视图 并且需要从单独的 JavaScript 文件内部访问传递给视图的变量 例如 var foo user name 有人有主意吗 帮手 的价值user name如果您想将其包含在 a 中 则
  • Haskell 你好世界,Eclipse IDE

    我在 eclipseFP 和 Haskell 中使用 hello world 时遇到问题 我有以下代码 module Main where main putStr Hello world 当我用它编译时 ghc exe H1 hs o hw
  • 在非时钟信号上使用上升沿是不好的做法吗?还有其他选择吗?

    我正在研究 VHDL 设计并且它可以工作 但是代码非常丑陋 而且我似乎正在尝试围绕语言的设计来实现我的目标 这一事实让我觉得有些事情是错误的 我对 VHDL 还很陌生 但我已经研究该项目的较小部分近一个月了 所以我有了总体想法 然而 这部分
  • 在 Python 中合并具有不同列的 CSV

    我有数百个大型 CSV 文件 我想将它们合并为一个 但是 并非所有 CSV 文件都包含所有列 因此 我需要根据列名称而不是列位置来合并文件 需要明确的是 在合并的 CSV 中 对于来自不包含该单元格列的行的单元格 值应该为空 我无法使用 p