-1

我运行一个外部函数,它将磁盘上文件的 Windows 路径作为字符串返回(字符串的一部分: Error details are at "C:\Users\ADMINI~1\AppData\Local\Temp\2\BuildErrors.txt" Succeeded

因此,我将返回的结果加载到一个字符串变量中: s = '''Error details are at "C:\Users\ADMINI~1\AppData\Local\Temp\2\BuildErrors.txt" Succeeded''' file_path = s.split('"')[1] print file_path

> C:\Users\ADMINI~1\AppData\Local\Temp\BuildErrors.txt#(后面有STX图标Temp

如果我file_path在 Python Shell 中访问,它的打印如下:

file_path 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\x02\\BuildErrors.txt'

我知道这\2是在 Python 中作为特殊字符处理的,但这使我无法读取文件,因为路径无效。

当我从外部函数获取字符串时,我已经有一个字符串对象,据我所知,您无法从中创建原始字符串 ( r'')。

我已经尝试s.encode('string-escape')过源字符串,但它保持\x02原位。

如何通过处理\2in 来生成有效路径?

4

2 回答 2

1

所以你有一些事情要做。

1) 你应该使用 Python 3。是时候了。

2) 如果您只想切换到 unix 风格的路径分隔符,莫尼克的回答是正确的。Python 将允许您在 Windows 系统上使用 unix 样式的路径。请记住,其他 Windows 外壳和程序不会。

3)这是发生了什么。如果您的字符串位于名为 fred.txt 的文件中,则

>>> with open('fred.txt') as f:
...  derf = f.readline()
...
>>> derf
'Error details are at "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\2\\BuildErrors.txt" Succeeded'
>>> file_path = derf.split('"')[1]
>>> file_path
'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\2\\BuildErrors.txt'
>>> os.path.split(file_path)
('C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\2', 'BuildErrors.txt')
>>>

然后一切似乎都正常。python shell 显示双斜杠是因为它在内部存储字符串的方式。如果您将该值写入文件或将其打印到您得到的屏幕上

>>> print(file_path)
C:\Users\ADMINI~1\AppData\Local\Temp\2\BuildErrors.txt
>>>

所以现在我们找到了问题的症结所在。斜杠字符 '\' 在 python 字符串中具有特殊含义。它用于告诉系统,嘿,下面可能会有所不同。所以我可以通过十六进制或 unicode 指定不出现在我的键盘上的字符。例如在字符串中定义井号的 3 种方法。我建议阅读http://python-reference.readthedocs.io/en/latest/docs/str/escapes.html

>>> a = "#"
>>> b = "\x23"
>>> c = "\u0023"
>>> a
'#'
>>> b
'#'
>>> c
'#'
>>> a == b
True
>>> a == c
True
>>> b == c
True
>>> 

所以如果'\'有特殊含义,我如何告诉系统我真的只想要一个斜线?你躲开它!python shell中的'\\'只是说我想要一个斜杠。

>>> s = "\\"
>>> s
'\\'
>>> print(s)
\
>>>
于 2016-05-21T07:30:55.617 回答
0

如果你的字符串路径是 'C:\ABC\xyz.txt' 那么语句,它会给你 'C:\\ABC\\xyz.txt'

为了使它成为 python 文件处理的有效路径,它的格式应该是 C:/ABC/xyz.txt

所以如果路径 = 'C:\\ABC\\xyz.txt'

路径 = path.replace("\\","/")

并且路径格式正确。

于 2016-05-21T06:28:58.150 回答