首页 > 解决方案 > python:将 os.Path 代码转换为 Pathlib 代码

问题描述

我在 python 中有以下函数,可以将 dict 作为行添加到 pandas DF,如果还没有创建第一个空 DF,它还负责创建第一个空 DF。我使用库 os 但我想更改为 Pathlib,因为我咨询了我公司的软件开发人员,有人说我应该使用 pathlib 而不是 os.Path 来解决这些问题。(注意,我没有CS背景)

def myfunc(dictt,filename, folder='', extension='csv'):
    if folder == '':
        folder = os.getcwd(). #---> folder = Path.cwd()
    filename = filename + '.' + 'csv'
    total_file = os.path.join(folder,filename) #<--- this is what I don't get translated
    
    # check if file exists, otherwise create it
    if not os.path.isfile(total_file):#<----- if total file is a Path object: totalfile.exists()
        df_empty = pd.DataFrame()
        if extension=='csv':
            df_empty.to_csv(total_file)
        elif extension=='pal':
            df_empty.to_pkl(total_file)
        else:
            #raise error
            pass

    
    # code to append the dict as row
    # ...

首先我不明白为什么 path lib 应该更好,其次我不明白如何翻译上面提到的行,即如何真正使用 pathlib 表示法执行 os.path.join(folder_path, filename)。

在路径库中,对于 Windows 和其他机器来说,它似乎是不同的方法,而且我也没有看到关于什么是 posix 路径的解释(docs here)。

谁能帮我解决这两条线?欢迎提供关于为什么使用 Pathlib 而不是 os.path 的见解。谢谢

标签: pythonpandaspathlibos.path

解决方案


首先,我不明白为什么 path lib 应该更好。

pathlib为 os.path 提供的相同功能提供面向对象的接口。使用os.path. os.path在 pathlib 出现之前,我们(python 社区)一直在愉快地使用。

然而,pathlib确实让生活更简单。首先,正如 Henry Ecker 的评论中所提到的,您正在处理路径对象,而不是字符串,因此在构建路径后您要做的错误检查更少,其次,路径对象的实例方法就在那里使用。

谁能帮我解决这两条线?

使用您的示例:

def mypathlibfunc(dictt, filename, folder='', extension='csv'):
    if folder == '':
        folder = pl.Path.cwd()
    else:
        folder = pl.Path(folder)

    total_file = folder / f'{filename}.{extension}'
    if not total_file.exists():
       # do your thing
       df_empty = pd.DataFrame()
       if extension == 'csv':
         df_empty.to_csv(total_file)
       elif extension == 'pal':
         df_empty.to_pickle(total_file)

笔记:

  • 如果您的函数是用 调用的folder != '',则正在从中构建一个Path对象,这是为了确保folder在函数的其余部分具有一致的类型。
  • Path可以使用除法运算符构造子对象/,这是我所做的total_file,我实际上并不需要包装f'{filename}.{extension}'Path对象中。漂亮整齐!参考
  • pandas.DataFrame.to_[filetype]除了路径字符串之外,所有方法都接受一个Path对象,因此您不必担心修改代码的那部分。

在路径库中,对于 Windows 和其他机器来说,它似乎是不同的方法,而且我也没有看到关于什么是 posix 路径的解释

如果您使用该Path对象,它将是跨平台的,您不必担心 windows 和 posix 路径。


推荐阅读