Python中的Windows路径

Gar*_*eth 116 python path string-literals

例如,表示Windows目录的最佳方法是什么"C:\meshes\as"?我一直在尝试修改脚本,但它永远不会起作用,因为我似乎无法正确获取目录,我假设因为'\'扮演转义角色?

joa*_*uin 175

你可以随时使用:

'C:/mydir'
Run Code Online (Sandbox Code Playgroud)

这适用于Linux和Windows.其他可能性是

'C:\\mydir'
Run Code Online (Sandbox Code Playgroud)

如果你有一些名字的问题,你也可以尝试原始的字符串文字:

r'C:\mydir'
Run Code Online (Sandbox Code Playgroud)

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

os.path.join(mydir, myfile)
Run Code Online (Sandbox Code Playgroud)

从python 3.4你也可以使用pathlib模块.这与上述情况相同:

pathlib.Path(mydir, myfile)
Run Code Online (Sandbox Code Playgroud)

要么

pathlib.Path(mydir) / myfile
Run Code Online (Sandbox Code Playgroud)

  • 对原始字符串唯一要小心的是它们不能以\结尾 (11认同)
  • @Gareth,我非常懒,经常发现自己使用'/'.但是从长远来看,使用os.path更方便.它还允许您使用mydir和myfile作为可以轻松修改的变量. (2认同)

Con*_*ngo 19

使用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())
Run Code Online (Sandbox Code Playgroud)

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

完整文章:Python 3 快速提示:在 Windows、Mac 和 Linux 上处理文件路径的简单方法


我的经验:

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

Path的优点os.path.join(...)

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

Path的优点normpath(...)

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


S.L*_*ott 15

使用该os.path模块.

os.path.join( "C:", "meshes", "as" )
Run Code Online (Sandbox Code Playgroud)

或者使用原始字符串

r"C:\meshes\as"
Run Code Online (Sandbox Code Playgroud)

  • 当组件是驱动器号时,os.path.join可能不会按预期运行,因为即使这样也允许相对路径.(第一行的结果是'C:Meshes \\ as'在Windows上.) (11认同)
  • 但它也不起作用。有效的是 `os.path.join( "C:\\", "meshes", "as" )` (3认同)
  • @JackO'Connor 这就是我所做的。您当然不想将“C:\”放在文件名的中间。此外,您可以在连接之前或之后使用“os.path.normpath”,以确保路径打印良好。 (2认同)

vau*_*tah 15

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

>>> '\a'
'\x07'
>>> len('\a')
1
>>> 'C:\meshes\as'
'C:\\meshes\x07s'
>>> print('C:\meshes\as')
C:\meshess
Run Code Online (Sandbox Code Playgroud)

其他常见的转义序列包括\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']
Run Code Online (Sandbox Code Playgroud)

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

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

  1. Python不会在前缀为r或的字符串文字中处理转义序列R:

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

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

    >>> import os
    >>> os.path.join('C:', os.sep, 'meshes', 'as')
    'C:\\meshes\\as'
    
    Run Code Online (Sandbox Code Playgroud)
  4. ......或更新的pathlib模块

    >>> from pathlib import Path
    >>> Path('C:', '/', 'meshes', 'as')
    WindowsPath('C:/meshes/as')
    
    Run Code Online (Sandbox Code Playgroud)


小智 8

Python 原始字符串是通过在字符串文字前添加 \xe2\x80\x98r\xe2\x80\x99 或 \xe2\x80\x98R\xe2\x80\x99 前缀来创建的。Python 原始字符串将反斜杠 () 视为文字字符。当我们想要一个包含反斜杠的字符串并且不希望将其视为转义字符时,这非常有用。

\n

手动执行例如:

\n
WindowsPath("C:\\meshes\\as")\n
Run Code Online (Sandbox Code Playgroud)\n

或者使用 r 或 R:

\n
WindowsPath(r'C:/meshes/as')\n
Run Code Online (Sandbox Code Playgroud)\n