【问题标题】:Additional double slashes appearing while using f-strings to create dynamic file name使用 f 字符串创建动态文件名时出现额外的双斜线
【发布时间】:2022-11-28 00:06:59
【问题描述】:

我正在尝试从共享文件夹位置读取 CSV 文件。由于位置容易发生变化,我想让它动态化。我尝试使用 f-strings 但出现以下错误。

看起来每个反斜杠都被转换成 2 倍数量的反斜杠。

import os
import pandas as pd

model_data_folder = r'\\abc.intranet.org.com\app1234\abc\1.1.1'
run_id = 'ABC'

Output=pd.read_csv(f'{model_data_folder}\{ABC},sep='\t', skiprows=0)

错误消息 - FileNotFoundError: File b'\\\\abc.intranet.org.com\\app1234\\abc\\1.1.1\\ABC.xlsx' does not exist

任何帮助将不胜感激。

我希望在没有那些额外的反斜杠的情况下正确识别文件位置

【问题讨论】:

  • 为什么不使用 os.path.join() 而不是 f 字符串?额外的斜杠是插入字节字符串的异常的产物,这就是它以 b' 开头的原因。不用担心,这不是您的代码的问题。

标签: python pandas f-string


【解决方案1】:

发生这种情况是因为 read_csv() 函数代码在尝试打开路径之前已将文件名编码为 bytes 值。然后将生成的异常格式化为表示该字节值的值,它始终是将重新创建字节串的有效 Python 表达式。

这不是您的代码的问题.

如果这真的困扰您,您可以捕获异常并使用解码为带有 os.fsdecode() function 的字符串的文件名重新引发它:

try:
    # ... code using pd.read_csv() ...
except FileNotFoundError as fnf:
    if isinstance(fnf.filename, bytes):
        fnf.filename = os.fsdecode(fnf.filename)
    raise

真的想要使用 os.path.join() function 来处理路径连接,而不是字符串格式化;它会更好地处理各种边缘情况:

output = pd.read_csv(os.path.join('model_data_folder', ABC), sep='	', skiprows=0)

read_csv() 函数也接受 Path objects,这仍然可以说是处理路径的更好的 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2019-07-05
    • 1970-01-01
    • 2023-02-08
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多