Psycopg2:将 CSV 数据复制到具有额外列值的表

2023-12-22

我正在使用copy_expert中的方法psycopg2将数据从 CSV 文件复制到 postgresql 表。我有这样的 postgres 表:

create table my_table (
  cola          text,
  colb          text,
  colc          text,
  cold          text,
  cole          text,
  colf          text,
  colg          text
)

还有一个包含前五列数据的 CSV,如下所示:

cola,colb,colc,cold,cole
1,foo,a,10,vvv
2,bar,b,20,www
3,baz,c,30,xxx
4,boo,d,40,yyy
5,baa,e,50,zzz

我想复制前五列的 CSV 数据,同时还指定colf and colg(每行应该具有相同的值colf and colg).

我可以将前五列复制到我的表中,如下所示:

conn = psycopg2.connect('dbname=name user=username')
cur = conn.cursor()
copy_sql = """
  copy my_table (cola, colb, colc, cold, cole)
  from stdin with
    csv
    header
    delimiter as ','
"""
from_csv = '/path/to/data.csv'
with open(from_csv, 'r') as f:
  cur.copy_expert(sql=copy_sql, file=f)
  conn.commit()
  cur.close()

如何使用 python 指定最后两列的值?我知道我可以在表 DDL 中指定默认值,如下所示:

create table my_table (
  cola          text,
  colb          text,
  colc          text,
  cold          text,
  cole          text,
  colf          text default 'foo',
  colg          text default 'bar'
)

但我想使用 python 添加值,因为每个 CSV 上传都有自己的值colf and colg,这些值是由我的 python 代码中的逻辑确定的。


看起来有几种方法可以做到这一点,首先将我需要的列添加到数据中,然后上传更新的数据。

使用petl包裹:

import psycopg2
from petl import fromcsv, addfield, todb

csv_file = '/path/to/data.csv'
table = fromcsv(csv_file)
table = addfield(table, 'colf', 'Some value')
table = addfield(table, 'colg', 'Another value')

conn = psycopg2.connect('dbname=test user=user')
todb(table, conn, 'my_table')

这对于小数据来说效果很好,但是对于大数据来说却非常慢。这psycopg2 copy_from and copy_expert命令似乎运行得更快,因为它们使用了postgresql批量复制。我能够使用复制我的数据copy_from首先将我的 csv 文件转换为pandas dataframe:

import psycopg2
import pandas as pd
from io import StringIO

csv_file = '/path/to/file'
df = pd.read_csv(csv_file)
df['colf'] = 'My value'
df['colg'] = 'Foobar'

为了利用psycopg2 copy_命令,我需要转换dataframe到一个类似文件的对象中read() and readline()方法,我可以使用StringIO:

buf = StringIO()
df.to_csv(buf, header=False, index=False)
buf.pos = 0

请注意,您需要设置pos缓冲区为 0,因为pandas.to_csv似乎默认将 pos 设置为末尾。看这个答案 https://stackoverflow.com/a/38468155/1994092以获得解释。

然后我可以复制该缓冲区对象:

conn = psycopg2.connect('dbname=test user=user')
cur = conn.cursor()
cur.copy_from(buf, 'my_table', sep=',')
conn.commit()
cur.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Psycopg2:将 CSV 数据复制到具有额外列值的表 的相关文章

随机推荐

  • 为什么缩减部署似乎总是会删除最新的 Pod?

    在开始之前 我在 Windows 10 上使用 minikube v27 我已经使用 nginx hello world 容器创建了一个部署 所需计数为 2 实际上 我进入了 2 小时 的旧 pod 并将 index html 文件从欢迎消
  • javafx.scene.layout.Pane 无法转换为 javafx.fxml.FXMLLoader

    我在尝试从一个场景切换到另一个场景时遇到问题 场景是这样的 当前视图和控制器 login fxml and LoginController 下一步视图和控制器 loggedWindow fxml and UserPanelControlle
  • 为什么我在使用 primefaces 时却使用omnifaces?

    我需要知道使用 OmniFaces 与我目前使用的 PrimeFaces 相比有什么好处 OmniFaces 提供哪些 PrimeFaces 不提供的功能 它们是不同的东西 你可以完美地将它们结合起来 Omnifaces 是 JSF 的一个
  • 来自数据帧的神经网络 LSTM 输入形状

    我正在尝试实施一个LSTM 与 Keras https keras io layers recurrent lstm 我知道 Keras 中的 LSTM 需要具有形状的 3D 张量 nb samples timesteps input di
  • 如何计算Kubernetes集群的节点可分配资源?

    我们有一个集群 其中节点资源不足 导致速度缓慢和过度提交问题 这迫使我们频繁重启节点 我们计划实施节点可分配资源策略 以在系统 kubelet 和应用程序 Pod 之间拆分可用的 CPU 内存和临时存储 遇到了一些有关可分配资源计算的准则h
  • 在 OSX 10.10 Yosemite 上安装 Nokogiri

    我最近升级到 10 10 Yosemite beta 但安装 Nokogiri 时遇到问题 我正在使用 RVM 和 Ruby 1 9 3 我也按照步骤操作here https gist github com vparihar01 58565
  • jQuery:列表在页面加载时扩展

    我一直在寻找非常简单的东西 如何在页面加载时使侧面导航以动画方式展开 但是我平时去的教程网站好像都没有 我能找到的最接近的是这个 jQuery 示例 http codeblitz wordpress com 2009 04 15 jquer
  • 如何使用节点检索 PayPal REST Api 访问令牌

    如何使用节点获取利用 REST Api 所需的 PayPal 访问令牌 一旦您拥有 PayPal 客户端 ID 和客户端密钥 您就可以使用以下内容 var request require request request post uri h
  • 如何在 AKS 上扩展 Cassandra 的 PVC 而不会丢失数据?

    首先我需要说的是 我没有使用 Cassandra 的经验 而且我也不是创建此部署的人 我在 AKS 的集群中运行 Cassandra 有状态集中配置的 PVC 为 1000Gi 目前 这些 Pod 已耗尽存储空间 并且一直处于不健康状态 我
  • 计算 3D 平面的斜率

    我有一组代表不同平面特征的 X Y Z 点 我需要使用法向量计算每个平面的斜率 我认为斜率是由每个平面的法线向量 NV 和假想水平面的 NV 之间的角度给出的 假设我使用的平面方程是 Ax By c z 然后我猜我的平面的法向量是 a b
  • 搜索 NSDictionaries 的 NSArray

    我有一个带有字典的数组 并且需要在数组中搜索 并修改通过字典内的对象名称找到的数组中的特定字典 因此 创建可变数组dictionary 并向该数组添加许多字典 self bloquesArray NSMutableArray alloc i
  • Linq To Entities - 如何过滤子实体

    我有实体Group and User the Group实体有Users属性是用户列表 用户有一个名为IsEnabled 我想编写一个返回列表的 linq 查询Groups 仅包含Users whose IsEnabled是真的 例如 对于
  • WordPress - 删除插件类中定义的操作

    所以我有这个插件代码 class WC List Grid public function construct add action wp array this setup gridlist 20 function setup gridli
  • Makemigrations 错误:django.db.utils.OperationalError:没有这样的表

    当我进行迁移时 我收到以下错误 django db utils OperationalError 没有这样的表 django site Traceback most recent call last File manage py line
  • 旋转 matplotlib Path 对象

    我正在使用 matplotlibPath http matplotlib org api path api html对象创建自定义绘图标记 如所述here https stackoverflow com questions 19448282
  • 使用 jest 测试另一个函数内的函数

    我如何使用 jest 测试下面的代码片段 我正在尝试测试温斯顿自定义格式printf https github com winstonjs winston formats sample js import aa b require thir
  • solr 守护进程

    我想用守护进程运行 solr 我在另一篇文章中看到有一个 init d 脚本可以运行 但它在我的 ubuntu 环境中似乎有问题 每当我尝试使用 etc init d solr start 运行脚本或尝试手动运行以下行时 daemon ja
  • ajax 调用时出现重复标头

    您好 创建了一个对控制器执行 ajax 调用的链接 以便使用 id UpdateCart 更新跨度 问题是 如果用户未经过身份验证 他将被发送到登录页面 并在页面上生成 从图像中可以看出 我的整个标头标签是如何复制并添加到 span 标签内
  • R 重新编译包失败,因为失败

    在我的 Linux 集群上 我在重新编译需要重新编译的 R 包时遇到问题 随着去除libRcpp so在最新版本中 最终目标是 让 R 包 DEseq2 运行 我们已经安装了新版本 g 中的 opt bin目录中有新库 opt lib64
  • Psycopg2:将 CSV 数据复制到具有额外列值的表

    我正在使用copy expert中的方法psycopg2将数据从 CSV 文件复制到 postgresql 表 我有这样的 postgres 表 create table my table cola text colb text colc