我正在使用 Python 的 csv 模块将数据从 sql server 写入 csv 文件,然后使用复制命令将 csv 文件上传到 postgres 数据库。问题是 Python 的 csv 编写器会自动将 Nulls 转换为空字符串“”,当列是 int 或 float 数据类型时,它会失败我的工作,它会尝试插入这个“”,而它应该是一个 None 或 null 值。
为了尽可能容易地与实现 DB API 的模块进行交互,值 None 被写为空字符串。
https://docs.python.org/3.4/library/csv.html?highlight=csv#csv.writer
保留空值的最佳方法是什么?有没有更好的方法用 Python 编写 csvs?我愿意接受所有建议。
我有经纬度值:
42.313270000 -71.116240000
42.377010000 -71.064770000
NULL NULL
写入 csv 时,它将空值转换为“”:
with file_path.open(mode='w', newline='') as outfile:
csv_writer = csv.writer(outfile, delimiter=',', quoting=csv.QUOTE_NONNUMERIC)
if include_headers:
csv_writer.writerow(col[0] for col in self.cursor.description)
for row in self.cursor:
csv_writer.writerow(row)
42.313270000,-71.116240000
42.377010000,-71.064770000
"",""
指定表示空值的字符串。默认值为文本格式的 \N(反斜杠-N)和 CSV 格式的未加引号的空字符串。对于不想区分空值和空字符串的情况,即使是文本格式,您也可能更喜欢空字符串。使用二进制格式时不允许使用此选项。
https://www.postgresql.org/docs/9.2/sql-copy.html
为我解决问题的是将引号更改为 csv.QUOTE_MINIMAL。
csv.QUOTE_MINIMAL 指示 writer 对象仅引用那些包含特殊字符(例如定界符、quotechar 或 lineterminator 中的任何字符)的字段。
相关问题:- Postgresql COPY empty string as NULL 不起作用
原文由 Jonathan Porter 发布,翻译遵循 CC BY-SA 4.0 许可协议