【问题标题】:Windows path in PythonPython 中的 Windows 路径
【发布时间】:2022-01-19 07:39:49
【问题描述】:

表示 Windows 目录(例如 "C:\meshes\as")的最佳方式是什么?我一直在尝试修改脚本,但它从来没有工作,因为我似乎无法正确获取目录,我认为是因为 '\' 充当转义字符?

【问题讨论】:

    标签: python path string-literals


    【解决方案1】:

    使用os.path 模块。

    os.path.join( "C:", "meshes", "as" )
    

    或者使用原始字符串

    r"C:\meshes\as"
    

    我还建议在路径或文件名中不要有空格。您可以在字符串中使用双反斜杠。

    "C:\\meshes\\as.jpg"
    

    【讨论】:

    • 当组件是驱动器号时,os.path.join 的行为可能与您预期的不同,因为即使在那时也允许使用相对路径。 (第一行的结果是 Windows 上的 'C:meshes\\as'。)
    • @dash-tom-bang 的评论非常重要。将"C:\" 作为第一个条目是否正确?这是否会破坏使用join 的一些清洁度?
    • @JackO'Connor 我就是这么做的。您当然不想将"C:\" 放在文件名的中间。此外,您可以在加入之前或之后使用os.path.normpath,以确保路径打印良好。
    • 但它也不起作用。有效的是os.path.join( "C:\\", "meshes", "as" )
    • @JackO'Connor 您正在与 Windows 打交道并且担心清洁问题? ;-)
    【解决方案2】:

    你可以一直使用:

    'C:/mydir'
    

    这适用于 linux 和 windows。 其他可能性是

    'C:\\mydir'
    

    如果您对某些名称有疑问,您也可以尝试原始字符串文字:

    r'C:\mydir'
    

    但最佳做法是使用os.path 模块函数,这些函数始终为您的操作系统选择正确的配置:

    os.path.join(mydir, myfile)
    

    从 python 3.4 开始,您还可以使用 pathlib 模块。这相当于上面的:

    pathlib.Path(mydir, myfile)
    

    pathlib.Path(mydir) / myfile
    

    【讨论】:

    • @Gareth,我很懒,经常发现自己使用'/'。但是从长远来看,使用 os.path 更方便。它还允许您使用 mydir 和 myfile 作为可以轻松修改的变量。
    • 对原始字符串唯一需要注意的是它们不能以 \ 结尾
    • 您可以使用 os.path.join() 来消除使用 \ 结束路径的需要。
    • 我喜欢 r(原始字符串)语法。如果您要复制一条长路径,通常必须用正斜杠替换所有反斜杠,这很有用
    • 原始字符串可以以 \\ 结尾,因此我们可以将文件连接到路径: codecs.open(r"C:\maXbox\EKON24\tweet_data\\" + file, 'r', encoding ='utf-8') as f:
    【解决方案3】:

    是的,Python 字符串文字中的\ 表示转义序列的开始。在您的路径中,您有一个有效的两字符转义序列\a,它被折叠成一个字符,即ASCII Bell

    >>> '\a'
    '\x07'
    >>> len('\a')
    1
    >>> 'C:\meshes\as'
    'C:\\meshes\x07s'
    >>> print('C:\meshes\as')
    C:\meshess
    

    其他常见的转义序列包括\t(制表符)、\n(换行)、\r(回车):

    >>> list('C:\test')
    ['C', ':', '\t', 'e', 's', 't']
    >>> list('C:\nest')
    ['C', ':', '\n', 'e', 's', 't']
    >>> list('C:\rest')
    ['C', ':', '\r', 'e', 's', 't']
    

    如您所见,在所有这些示例中,反斜杠和文字中的下一个字符组合在一起形成最终字符串中的单个字符。 Python 的转义序列的完整列表是here

    有多种方法可以解决这个问题:

    1. Python will not process escape sequences in string literals prefixed with r or R:

      >>> r'C:\meshes\as'
      'C:\\meshes\\as'
      >>> print(r'C:\meshes\as')
      C:\meshes\as
      
    2. Windows 上的 Python 也应该处理正斜杠。

    3. 你可以使用os.path.join ...

      >>> import os
      >>> os.path.join('C:', os.sep, 'meshes', 'as')
      'C:\\meshes\\as'
      
    4. ...或更新的pathlib module

      >>> from pathlib import Path
      >>> Path('C:', '/', 'meshes', 'as')
      WindowsPath('C:/meshes/as')
      

    【讨论】:

      【解决方案4】:

      使用 PowerShell

      在 Windows 中,您可以在路径中使用 /,就像在任何地方使用 Linux 或 macOS 一样只要您使用 PowerShell 作为命令行界面。它在 Windows 上预安装,并且支持许多 Linux 命令,例如 ls 命令。

      如果您使用 Windows 命令提示符(当您在 Windows 开始菜单中键入 cmd 时出现的提示符),您需要在其中指定带有 \ 的路径。您可以在所有其他地方(代码编辑器、Python 交互模式等)使用/ 路径。

      【讨论】:

        【解决方案5】:

        使用Path:

        from pathlib import Path
        data_folder = Path("source_data/text_files/")
        file_to_open = data_folder / "raw_data.txt"
        print(file_to_open.read_text())
        

        Path 采用类似路径的字符串,并针对当前操作系统(Windows 或 Linux)调整所有内容。例如,在 Linux 上它将所有反斜杠转换为正斜杠,而在 Windows 上则相反。

        全文:Python 3 Quick Tip: The easy way to deal with file paths on Windows, Mac and Linux


        我的经验:

        • 我用了6个月os.path.join(...),然后切换到normpath(...),最后切换到Path(...)。 Path 使用了这三者,是世界上最好的。

        Path 相对于os.path.join(...) 的优势:

        • 清洁剂。
        • 少打字。
        • 更容易阅读路径(即更具可读性)。
        • 可以使用/ 加入两条不同的路径(见上文)。
        • 更现代。

        路径优于normpath(...)

        • 可以使用/ 加入路径,而不必回退到os.path.join(...),通过嵌套的 normpath 调用来解决问题。
        • 清洁剂。
        • 少打字。
        • 更容易阅读路径(即更具可读性)。
        • 在 Linux 和 Windows 之间移植时出现错误的可能性较小。
        • 更现代。

        【讨论】:

          【解决方案6】:

          Python 原始字符串是通过在字符串文字前加上“r”或“R”来创建的。 Python 原始字符串将反斜杠 () 视为文字字符。当我们想要一个包含反斜杠的字符串并且不希望它被视为转义字符时,这很有用。

          手动操作如:

          WindowsPath("C:\meshes\as")
          

          或使用 r 或 R:

          WindowsPath(r'C:/meshes/as')
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-15
            • 2015-12-07
            相关资源
            最近更新 更多