我知道以下字符串定义表示(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上进行的
有关详细信息,请查看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
确认
这个字符串行为记录在(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,它确实要好得多。
我希望能成功回答你的问题吗?