带有空字符串的条件 f 字符串格式

问题描述

我正在开发一个小型代码生成应用程序,该应用程序加载到 Excel 文件中(使用 pandas ExcelFile + xlrd),然后将其解析为多个 sql 的数据框 (ExcelFile.parse) - 类似的操作。然后使用 maplambda 函数将存储的数据作为列表返回给文件编写器,并在特定字段上使用一些 f 字符串格式。

我遇到的问题是并非 Excel 文件中的所有字段都可以预测填充,因此我在解析到数据帧期间使用了 fillna(''),但是当我来到 f 字符串时,未填充的当我应用 :.0f 格式删除小数时,字段会导致错误。如果我不使用 fillna('') 函数,浮点数将正确格式化,但是我有多个 nan 条目作为字符串值,我无法弄清楚如何转换为 ''。

例如,下面将失败并显示 fillna(''),因为源电子表格中的 NumField3 和 NumField 4 可以为空。

return list(
         map(
            lambda row: f"EXEC ***_****_*.****_Register_File("
            f"{row['NumField1']:.0f},{row['NumField2']:.0f},"
            f"'{row['TextField1']}','{row['TextField2']}',"
            f"'{row['TextField3']}','{row['TextField4']}',"
            f"{row['NumField3']:.0f},{row['NumField4']:.0f});\n",df.to_dict("records")))

我最初的方法是使用 .format()itertuples(),但这显然是一种效率较低的方法。我选择了转换为字典,这样我就可以在列表结构中保留字段名称,以便于支持

我可能遗漏了一些非常简单的东西,但目前我只见树木不见森林。有什么建议吗?

解决方法

我想我已经解决了。我已经从 ExcelFile 对象到数据帧的解析中删除了 fillna(''),这导致 NaN 值出现在未填充的字段中。当数据帧记录最终通过 map lambda 方法处理时,原始 NaN 值显示为字符串 'nan',因此我包含了一个 re.sub 来查找该值作为一个完整的单词并将其替换为所需的空字符串。

它不漂亮,但很管用。

return list(
        re.sub(r'\bnan\b','',i) for i in map(
            lambda row: f"EXEC ***_****_*.****_Register_File("
            f"{row['NumField1']:.0f},{row['NumField2']:.0f},"
            f"'{row['TextField1']}','{row['TextField2']}',"
            f"'{row['TextField3']}','{row['TextField4']}',"
            f"{row['NumField3']:.0f},{row['NumField4']:.0f});\n",df.to_dict("records")))