You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python从MySQL导出CSV时区分NULL与空字符串(无行级操作)

解决方案

核心思路

要精准区分数据库的NULL(对应DataFrame中的NaN)和空字符串,需要自定义字段输出规则:

  • 数据库NULL → 输出无引号的空值
  • 空字符串 → 输出带双引号的""
  • 其他值(整数、字符串、日期等)→ 输出带双引号的字符串

实现代码

方法1:结合Pandas与csv模块(高效无行级循环)

通过批量格式化DataFrame元素,再用csv.writer写入,避免逐行操作,适合大数据量场景:

import mysql.connector
import pandas as pd
import csv
import numpy as np

# 连接数据库
mydb = mysql.connector.connect(
    host="hostname",
    user="user_name",
    password="pwd",
    database="db_name"
)

# 读取指定列(替换为你需要的列名)
sqlquery = pd.read_sql_query('''select col1, col2, col3, col4, col5 from db_name.table_name''', mydb)
df = pd.DataFrame(sqlquery)

# 自定义值格式化逻辑
def format_val(val):
    if pd.isna(val):
        # 对应数据库NULL,输出无引号空值
        return ''
    elif val == '':
        # 空字符串输出带引号的""
        return '""'
    else:
        # 其他值转字符串后包裹双引号
        return f'"{str(val)}"'

# 批量格式化所有元素
formatted_df = df.applymap(format_val)

# 写入CSV文件
with open('file_name.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f, delimiter='|', quoting=csv.QUOTE_NONE)
    # 写入带引号的表头
    writer.writerow([f'"{col}"' for col in df.columns])
    # 写入数据行
    writer.writerows(formatted_df.values.tolist())

方法2:纯Pandas快捷实现(小数据量友好)

利用Pandas原生导出功能,配合占位符替换,代码更简洁:

import mysql.connector
import pandas as pd
import csv

mydb = mysql.connector.connect(
    host="hostname",
    user="user_name",
    password="pwd",
    database="db_name"
)

sqlquery = pd.read_sql_query('''select col1, col2, col3, col4, col5 from db_name.table_name''', mydb)
df = pd.DataFrame(sqlquery)

# 用特殊占位符标记空字符串
df = df.replace('', '__EMPTY_MARKER__')

# 导出CSV:NaN对应空值,其他值自动加引号
df.to_csv('file_name.csv', 
          index=False, 
          sep='|', 
          quoting=csv.QUOTE_ALL, 
          na_rep='')

# 将占位符替换回带引号的空字符串
with open('file_name.csv', 'r+', encoding='utf-8') as f:
    content = f.read().replace('"__EMPTY_MARKER__"', '""')
    f.seek(0)
    f.write(content)
    f.truncate()

验证说明

两种方法都能实现你要求的格式:数据库行ABC, 123,,NULL,2022-12-22会被导出为"ABC"|"123"|""||"2022-12-22",严格区分空字符串和NULL值。

内容的提问来源于stack exchange,提问作者300

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:10:33