我正在学习Windows 7中的python 3.3。我有两个文本文件 - lines.txt和raven.txt在一个文件夹中。两者都包含第一个示例的相同文本。
当我尝试使用下面的代码访问乌鸦时,我收到错误 -
OSError: [Errno 22] Invalid argument: 'C:\\Python\raven.txt'
我知道上面的错误可以通过使用像这样的转义字符来解决 -
C:\\Python\\raven.txt
C:\Python\\raven.txt
为什么两种方法都有效?奇怪的是,当我在同一个文件夹中访问lines.txt
时,我没有收到任何错误!为什么?
import re
def main():
print('')
fh = open('C:\Python\lines.txt')
for line in fh:
if re.search('(Len|Neverm)ore', line):
print(line, end = '')
if __name__ == '__main__':main()
此外,当我使用下面的行时,我得到一个完全不同的错误 - TypeError: embedded NUL character
。为什么?
fh = open('C:\Python\Exercise Files\09 Regexes\raven.txt')
我可以在文件路径中的每个\之前使用\
来解决此问题。
答案 0 :(得分:2)
\ r \ n是转义字符,但\ l不是。因此,线被解释为线,而raven被解释为aven
,因为\ r被转义。
In [1]: len('\l')
Out[1]: 2
In [2]: len('\r')
Out[2]: 1
您应始终使用\\
转义反斜杠。如果你的字符串没有引号,你也可以使用原始字符串:
In [9]: len(r'\r')
Out[9]: 2
In [10]: r'\r'
Out[10]: '\\r'
请参阅:https://docs.python.org/3/reference/lexical_analysis.html
答案 1 :(得分:1)
也许您可以使用raw string。
就像这个open(r'C:\Python\Exercise Files\09 Regexes\raven.txt')
。
当存在
r' or
R'前缀时,仍然使用反斜杠 引用以下字符,但所有反斜杠都留在 串。例如,字符串文字r“\ n”由两个组成 字符:反斜杠和小写的“n”。字符串引号可以是 用反斜杠转义,但反斜杠仍在字符串中;对于 例如,r“\”“是一个由两个字符组成的有效字符串文字: 反斜杠和双引号; r“\”不是值字符串文字 (即使原始字符串也不能以奇数个反斜杠结尾)。 具体来说,原始字符串不能以单个反斜杠结尾(因为 反斜杠会逃避以下引号字符)。另请注意 单个反斜杠后跟换行符被解释为这两个 字符作为字符串的一部分,而不是行的延续。
答案 2 :(得分:1)
你实际上可以使用正斜杠而不是向后斜杠,这样你根本不必逃避它们,这可以省去很多麻烦。像这样:'C:/Python/raven.txt',我可以保证它适用于Windows。