python中的文件路径,可能的写作风格

问题描述 投票:0回答:2

我知道以下字符串定义表示(python internal)相同(基本知识):

s1 = "D:\\users\\xy\\Desktop\\PC_daten.txt"
s2 = r"D:\users\xy\Desktop\PC_daten.txt"

因此,如果你做它,例如PythonWin中的交互式:

>>> s1 = "D:\\users\\xy\\Desktop\\PC_daten.txt"
>>> s1
'D:\\users\\xy\\Desktop\\PC_daten.txt'
>>> print s1
D:\users\xy\Desktop\PC_daten.txt
>>> s2 = r"D:\users\xy\Desktop\PC_daten.txt"
>>> s2
'D:\\users\\xy\\Desktop\\PC_daten.txt'
>>> print s2
D:\users\xy\Desktop\PC_daten.txt

对我来说很清楚(明白)

但令我困惑的是,在内置函数的python中打开所有这些(部分疯狂的)路径编码工作(在PythonWin中进行交互式测试):

>>> a = open("D:\users\xy\Desktop\PC_daten.txt")
>>> a
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000046989C0>
>>> b = open("D:\\users\\xy\\Desktop\\PC_daten.txt")
>>> b
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000048B2300>
>>> c = open(r"D:\users\xy\Desktop\PC_daten.txt")
>>> c
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000048B20C0>
>>> d = open(r"D:\\users\\xy\\Desktop\\PC_daten.txt")
>>> d
<open file 'D:\\\\users\\\\xy\\\\Desktop\\\\PC_daten.txt', mode 'r' at 0x00000000048B2390>

我的问题:

  • 这种行为记录在哪里?
  • 有任何背景信息吗?

测试是在Windows 7操作系统和PythonWin 2.7.13上进行的

python string path backslash
2个回答
0
投票

有关详细信息,请查看the docs中的第2.4.1节

让我们来看看不同的字符串及其工作原理:

>>> a = open("D:\users\xy\Desktop\PC_daten.txt")
>>> a
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000046989C0>

\是字符串中的转义字符,用于特殊字符,如换行符(\n)。在这种情况下,你很幸运,没有任何组合\u \x \P表明这样的特殊字符,因此它有效,而不是open("foo\newfile.txt")

>>> b = open("D:\\users\\xy\\Desktop\\PC_daten.txt")
>>> b
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000048B2300>

保存方法,\\构造逃脱\,因此你也可以做open("foo\\newline")

>>> c = open(r"D:\users\xy\Desktop\PC_daten.txt")
>>> c
<open file 'D:\\users\\xy\\Desktop\\PC_daten.txt', mode 'r' at 0x00000000048B20C0>

另外保存,因为前缀r表示原始字符串,\字面意思而不是转义序列

>>> d = open(r"D:\\users\\xy\\Desktop\\PC_daten.txt")
>>> d
<open file 'D:\\\\users\\\\xy\\\\Desktop\\\\PC_daten.txt', mode 'r' at 0x00000000048B2390>

这里你有一个原始字符串(以r开头)但仍然使用双\,因此你在路径中有\\。这是有效的,因为Windows了解双\路径,你也可以在cmd确认


0
投票

这个字符串行为记录在(Python v3.7 docs)2.4.1. String and Bytes literals下,open()的行为记录在2. Built-in Functions下。 具体来说,open()中的文件/路径在16.1.2. Process Parameters下澄清,在条目class os.PathLike中。不可否认,这是很多阅读,以真正理解这个参数。

总结:r“string”是原始字符串。使用原始斜线时,您不需要像\\那样使用斜杠来生成单斜杠\

在第二个块中,为了清楚起见,您正在查看变量本身并通过它们的字符串表示(使用打印时)查看它们(我想你提到你理解很好,但我只是想重复一遍给你为了确定)。

展望未来,python版本在处理文件和文件夹时都将使用PathLike对象。我猜你还在Python 2.x,因为你在运行print s1时没有出错 - 应该是Python 3.x中的print(s1)。我建议尽快转到Python 3,它确实要好得多。

我希望能成功回答你的问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.