为了账号安全,请及时绑定邮箱和手机立即绑定

将字符串的一部分替换为 null

将字符串的一部分替换为 null

UYOU 2023-06-27 14:31:58
我需要使用 Python 自动将 Excel 文件导入到 PostgreSQL 中。我对 Python 比较陌生,但设法自动创建表。现在我陷入了将数据导入表的困境。我遇到的问题是在 PostgreSQL 中我已将某些列定义为日期列。但是,许多“日期”列还没有任何数据。因此它被标记为nan。但是,psycopg2 不喜欢 nan 作为日期列的值,而是期望为空。当将列表转换为字符串(应传递到 )时INSERT INTO {sheet} VALUES ({formatted_data_string}),我相信表的各个条目应该在看起来像这样的字符串中:'data', 'data', 'data', null, 'data'下面的代码从 Excel 文件获取数据,然后创建 formatted_data_string应该插入到 SQL 语句中。 def import_data(path):    xl = pd.ExcelFile(path)    sheets = xl.sheet_names    conn = psycopg2.connect(host=host, port=port, database=database, user=user, password=password)    cur = conn.cursor()    sheet_column_names = []    for sheet in sheets:        if sheet == 'ReadMe':            continue        df = pd.read_excel(xl, sheet)        list_of_rows = df.to_numpy().tolist()        for entry in list_of_rows:            if entry == list_of_rows[0]:                continue            formatted_data = []            for element in entry:                if element == 'nan':                    formatted_data.append('null')                else:                    formatted_data.append(f"'{element}'")            formatted_data_str = ','.join(str(element) for element in formatted_data)            print(formatted_data_str)几乎所有数据的格式都正确,除了“nan”值仍然显示为“nan”而不是null我所期望的。我多次检查了代码,但不明白为什么它不将 nan 替换为 null。这是我当前从此代码中获取的 formatted_data_str 的示例: '25...1','Something','XX','XX','[relToChild, relToParent]','Some Other Data','2018-10-09 06:04:28.015000','nan','1','DISABLED','nan',...这段代码有问题吗?或者我是否遗漏了一些明显的东西来将 nan 替换为不带引号的 null ?
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

所以我找到了一个解决我的问题的方法,效果很好。使用以下命令创建第二个 DataFrame 会将所有 nan 替换为 None。


df = pd.read_excel(xl, sheet)

df1 = df.where(pd.notnull(df), None)

然后,这允许我使用 For 循环来定位 None,用 null 替换所有 None。在数据对象周围添加第二个单引号。


for element in entry:

   if element != None:

      formatted_data.append(f"'{element}'")

      continue

   else:

      formatted_data.append('null')

使用将新列表(formatted_data)转换为字符串后


formatted_data_str = ','.join(str(element) for element in formatted_data)

生成的字符串采用我上面解释的所需格式。服务器接受 SQL 语句,并且 PostgreSQL 数据库中的数据似乎是正确的。我知道这可能不是最好的解决方案,但它对我有用,这就是我现在所需要的。


查看完整回答
反对 回复 2023-06-27
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信