字符串文字前缀 "r" 意味着什么确切的代码点转换 (Python 3.4)?
What exact code-point conversion does string literal prefix "r" imply (Python 3.4)?
字符串前缀 "r"(或 "R")实际上对 Python 中的字符串文字执行什么 Unicode 代码点转换(literals/files 解析为 UTF-8 )?
我在 Windows 7.
上使用 Python 3.4
我想在 Windows 上解析此 "evil" 路径:
>>> a = 'c:\a\b\f\v'
>>> a
'c:\x07\x08\x0c\x0b'
>>> a.decode(encoding='utf-8')
b'c:\x07\x08\x0c\x0b'
使用前缀 "r",我得到:
>>> b = r'c:\a\b\f\v'
>>> b
c:\a\b\f\v
我的问题:如何在内存中的 Unicode 字符串对象(不是字符串文字)上(准确地)模仿 "raw" 代码点 mapping/conversion?我可以使用 str.translate and str.maketrans,但我们在谈论什么确切的映射?
上下文:一般来说,我希望支持 Windows(和其他平台)上的各种奇怪的目录名称通过命令行参数作为字符串传递给我的应用程序。我怎么可以?
字符串前缀 "r"(或 "R")在 Python 3(literals/files 解析为 UTF-8)?
Python 3 本机字符串已经是 UTF-8(默认情况下),没有使用 r
前缀进行转换。
如果没有 r
前缀,则转换为前缀为 \
的字符。参见 here
\a gives the code for a bell (a - alarm) 0x07
\b gives the code for a backspace 0x08
\f is a form feed 0x0c
\v is a vertical tab 0x0b
因此,如果您有(您所说的)奇怪的 Windows 路径名,请始终使用原始字符串,或者使用 /
作为目录分隔符。但是你只需要担心那些硬编码的,因为它们是由 python 解析的,那些由用户输入的应该没问题。
编辑:
如果你这样做:
>>> import os.path
>>> os.path.normpath('C:\bash')
'C:\x08ash'
>>> var = input("Enter a filename: ")
Enter a filename: C:\bash
>>> print(var)
C:\bash
>>> os.path.normpath(var)
'C:\bash'
双反斜杠与使用原始字符串的效果相同。
>>> 'c:\a\b\f\v'
'c:\x07\x08\x0c\x0b'
当您在 Python 源代码 中键入像这样 的字符串文字时,您需要将反斜杠加倍或使用 r
作为原始字符串.
>>> 'c:\a\b\f\v'
'c:\a\b\f\v'
>>> r'c:\a\b\f\v'
'c:\a\b\f\v'
>>> print('c:\a\b\f\v')
c:\a\b\f\v
>>> print(r'c:\a\b\f\v')
c:\a\b\f\v
这与 Unicode 无关。 是 Python 解释器正在评估字符串文字中的反斜杠转义序列。
这仅适用于源代码中的字符串文字。如果您从命令行或文件中读取字符串,则不必担心这些。 Python 在这些情况下不解释反斜杠。
字符串前缀 "r"(或 "R")实际上对 Python 中的字符串文字执行什么 Unicode 代码点转换(literals/files 解析为 UTF-8 )?
我在 Windows 7.
上使用 Python 3.4我想在 Windows 上解析此 "evil" 路径:
>>> a = 'c:\a\b\f\v'
>>> a
'c:\x07\x08\x0c\x0b'
>>> a.decode(encoding='utf-8')
b'c:\x07\x08\x0c\x0b'
使用前缀 "r",我得到:
>>> b = r'c:\a\b\f\v'
>>> b
c:\a\b\f\v
我的问题:如何在内存中的 Unicode 字符串对象(不是字符串文字)上(准确地)模仿 "raw" 代码点 mapping/conversion?我可以使用 str.translate and str.maketrans,但我们在谈论什么确切的映射?
上下文:一般来说,我希望支持 Windows(和其他平台)上的各种奇怪的目录名称通过命令行参数作为字符串传递给我的应用程序。我怎么可以?
字符串前缀 "r"(或 "R")在 Python 3(literals/files 解析为 UTF-8)?
Python 3 本机字符串已经是 UTF-8(默认情况下),没有使用 r
前缀进行转换。
如果没有 r
前缀,则转换为前缀为 \
的字符。参见 here
\a gives the code for a bell (a - alarm) 0x07
\b gives the code for a backspace 0x08
\f is a form feed 0x0c
\v is a vertical tab 0x0b
因此,如果您有(您所说的)奇怪的 Windows 路径名,请始终使用原始字符串,或者使用 /
作为目录分隔符。但是你只需要担心那些硬编码的,因为它们是由 python 解析的,那些由用户输入的应该没问题。
编辑:
如果你这样做:
>>> import os.path
>>> os.path.normpath('C:\bash')
'C:\x08ash'
>>> var = input("Enter a filename: ")
Enter a filename: C:\bash
>>> print(var)
C:\bash
>>> os.path.normpath(var)
'C:\bash'
双反斜杠与使用原始字符串的效果相同。
>>> 'c:\a\b\f\v'
'c:\x07\x08\x0c\x0b'
当您在 Python 源代码 中键入像这样 的字符串文字时,您需要将反斜杠加倍或使用 r
作为原始字符串.
>>> 'c:\a\b\f\v'
'c:\a\b\f\v'
>>> r'c:\a\b\f\v'
'c:\a\b\f\v'
>>> print('c:\a\b\f\v')
c:\a\b\f\v
>>> print(r'c:\a\b\f\v')
c:\a\b\f\v
这与 Unicode 无关。 是 Python 解释器正在评估字符串文字中的反斜杠转义序列。
这仅适用于源代码中的字符串文字。如果您从命令行或文件中读取字符串,则不必担心这些。 Python 在这些情况下不解释反斜杠。