python - 用 null 替换字符串的一部分
问题描述
我需要使用 Python 自动将 Excel 文件导入 PostgreSQL。我对 Python 比较陌生,但设法自动创建表。现在我被困在将数据导入表中。
我遇到的问题是在 PostgreSQL 中我将某些列定义为日期列。但是,对于许多“日期”列,还没有任何数据。因此它被标记为nan。但是,psycopg2 不喜欢 nan 作为 Date 列的值,而是期望 null。
将列表转换为应传递给的字符串时INSERT INTO {sheet} VALUES ({formatted_data_string})
,我相信 Table 的各个条目应该在一个看起来像这样的字符串中:'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
我期望的值。我多次检查了代码,但无法弄清楚为什么它没有用 null 替换 nan。
这是我目前从这段代码中获得的 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 ?
解决方案
所以我找到了一个可以很好地解决我的问题的解决方案。使用以下命令创建第二个 DataFrame 会将所有 nan 替换为 None。
df = pd.read_excel(xl, sheet)
df1 = df.where(pd.notnull(df), None)
然后,这允许我使用 For 循环来定位 None,将所有 None 替换为 null。在 Data 对象周围添加第二个单引号。
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 数据库中的数据似乎是正确的。我知道这可能不是最好的解决方案,但它对我有用,这就是我现在所需要的。
推荐阅读
- reactjs - 如何在带有 firefox 的 React 应用程序中使用 clientX 和 clientY
- docker - 为什么 Docker 镜像链接包含多个版本和标签?
- javascript - JavaScript:当使用页面之间的数据传输时,为什么我在提交时运行的表单验证停止工作?
- reactjs - 重新渲染仅发生在第二次状态更改时,
- git - 如何在 git 中管理用户友好的 .env?
- python-3.x - Travis CI 使用 openpyxl 失败(==3.0.4)
- r - 我们可以使用 tidyverse::tibble 中的 add_row 和 cross
- delphi - 安装用户定义的组件时会导致 DCLUSR.$$$ 访问被拒绝错误的原因
- sql - 使用python没有向postgresql请求显示表
- python - Scipy.Optimize.Minimize 函数为所有输入值返回几乎相同的值。请帮我找出错误