Python转义字符

Python转义字符,python,path,escaping,Python,Path,Escaping,我已经为此奋斗了几个小时,虽然我找到了解决办法,但我不喜欢它。 是否有解决此问题的内置方法: 您在Windows上的变量包含路径。 您正试图用它打开一个文件,但它包含的转义字符在运行时之前无法确定 如果您使用“shutil”并执行以下操作: shutil.copy(文件路径、新文件路径) 它很好用 但如果您尝试使用相同的路径: f=open(文件路径,encoding=“utf8”) 它不起作用,因为路径中的'\a'被读取为'Bell'=7 我试着做了所有这些,但我唯一能做的就是自定义函数“重建

我已经为此奋斗了几个小时,虽然我找到了解决办法,但我不喜欢它。 是否有解决此问题的内置方法:

您在Windows上的变量包含路径。 您正试图用它打开一个文件,但它包含的转义字符在运行时之前无法确定

如果您使用“shutil”并执行以下操作:
shutil.copy(文件路径、新文件路径)

它很好用

但如果您尝试使用相同的路径:

f=open(文件路径,encoding=“utf8”)

它不起作用,因为路径中的'\a'被读取为'Bell'=7

我试着做了所有这些,但我唯一能做的就是自定义函数“重建破碎的字符串”

    file_path = "F:\ScriptsFilePath\addons\import_test.py"

    print(sys.getdefaultencoding())
    print()
    print(file_path.replace('\\', r'\\'))
    print( '%r' % (file_path))
    print( r'r"' + "'" + file_path+ "'")
    print(file_path.encode('unicode-escape'))
    print(os.path.normpath(file_path))
    print(repr(file_path))

    print()
    print(reconstruct_broken_string(file_path))


backslash_map = { '\a': r'\a', '\b': r'\b', '\f': r'\f',
                  '\n': r'\n', '\r': r'\r', '\t': r'\t', '\v': r'\v' }
def reconstruct_broken_string(s):
    for key, value in backslash_map.items():
        s = s.replace(key, value)
    return s
这是打印件:

utf-8

F:\\ScriptsFilePathddons\\import_test.py
'F:\\ScriptsFilePath\x07ddons\\import_test.py'
r"'F:\ScriptsFilePathddons\import_test.py'
b'F:\\\\ScriptsFilePath\\x07ddons\\\\import_test.py'
F:\ScriptsFilePathddons\import_test.py
'F:\\ScriptsFilePath\x07ddons\\import_test.py'

F:\ScriptsFilePath\addons\import_test.py
是否有一种内置的方式来实现此功能而不是此功能? 为什么它与“shutil”一起工作而不与“open”一起工作


谢谢

您的问题在这条线上:

file_path = "F:\ScriptsFilePath\addons\import_test.py"
请尝试以下方法之一:

file_path = r"F:\ScriptsFilePath\addons\import_test.py"
file_path = "F:\\ScriptsFilePath\\addons\\import_test.py"
甚至:

file_path = "F:/ScriptsFilePath/addons/import_test.py"
(是,Windows接受正斜杠作为文件分隔符。)


Ref:

如果路径在变量中,只需使用Python的任何字符串操作函数将所有“\”替换为“/”。它应该可以解决这个问题。

这里有一个简化版本,演示了“repr”如何不能正确工作

file_path = "F:\tab\a_bell\newline.py"
print(file_path)
print(repr(file_path))
这张照片是:

F:  ab_bell
ewline.py

and

F:\tab\x07_bell\newline.py'
正如您所看到的,“repr”与escape选项卡、escape换行符等一起使用,但与作为escape bell的“\a”不一起使用

这是“repr”中的bug吗? 对于这个问题,是否有一个内置的解决方案,不需要程序员编写一个自定义函数,比如“重建”断开的字符串?
如果不是,python怎么会这么蹩脚呢?

我也遇到过同样的问题-尝试了
路径='C:\temp\importfile.xlsx'
,但不断得到一个错误
“没有这样的文件或目录:'C:\\temp\\importdata.xlsx'
。我使用了前斜杠,我的导入成功了。您是否尝试过
file\u path=“F:/ScriptsFilePath/addons/import\u test.py”

您可以在字符串前面使用r,以便Python将其作为原始字符串处理-

filePath = input()
try:
    print(filePath)
except:
    print(r""+filePath)

或者使用前斜杠。具体来说,它是
\a
转义。是的,但路径位于我在运行时获得的变量中,我无法在变量名称前面添加“r”。请编辑您的问题,以包括初始化该变量的代码。初始化该变量的代码是文件浏览器窗口的返回值。我无法控制。你在用什么图形工具包?您能否提供一个使用工具包并再现错误的小程序?请将您的程序缩减到演示错误的尽可能小的完整程序。然后将这个简短的程序复制粘贴到你的问题中。有关此调试技术的信息,请参阅。如果使用python3,可以使用对
str.translate
(如果使用的是python3)的唯一调用来简化
重建断开的\u字符串。只需更改
反斜杠映射
,使键为*代码点*(即
ord('\a'):r'\a'
)并调用
文件路径.translate(反斜杠映射)
。我尝试了这个方法,但没有效果:反斜杠映射={ord('\a'):r'\a')。然后:文件路径。translate(反斜杠映射)让我们从另一个角度来尝试一下。你说
open()?
open()
返回什么?它是否引发了一个例外?如果是,您可以复制粘贴精确的错误消息吗?“Open”找不到文件,因为路径中的“\a”被视为转义字符(bell,它是7)。为什么“Open”甚至在传递给它的路径中寻找转义字符。传递给“Shutil”以复制文件的变量中的同一路径可以正常工作。”Shutil’足够聪明,不会在路径中寻找转义字符,为什么‘Open’不够聪明,不会这样做?怎么做?我尝试了file\u path.replace(“\\”,“/”)您必须将转义字符加倍,否则它将无法运行,并打印为:F:\scriptsfilepathdons\import\u test.py。再次,此程序的问题是行
file\u path=“F:\tab\a\u bell\newline.py”
。该字符串文本中有一个制表符、一个贝尔和一个换行符。如果要在字符串中使用斜杠,则必须将其转义为
'\\'
或使用原始字符串
r'f:\tab…'
。但是我怀疑这不是你真正的程序的问题,因为你在其他地方说过你没有赋值语句。
repr
在这个程序中运行得很好
repr()
返回一个字符串,如果传递给
eval()
将生成原始值。请看我的测试示例:file\u path=“F:\tab\a\u bell\newline.py”repr正确处理选项卡中的“\t”,正确处理“\n”,但不正确处理“\a”。为什么repr不能更正字符串中的所有转义字符?
repr
的输出是正确的
\t
是制表符,
\n
是换行符,
\x07
是警告字符。但是,你为什么在乎?您使用
repr()
做什么?我很难想象在任何情况下,你都可以在你的程序中合法地使用repr()函数。如果你看看上面,我尝试了很多方法来解决“打开”将路径中的反斜杠视为一种逃避的问题。我在谷歌上搜索过这个问题,无数人都遇到过同样的问题,但我没有找到一个“解决”的问题,尽管所有人都遇到过类似的问题。问题其实很简单:为什么“Open”将反斜杠视为转义,而它应该只查看作为路径传递给它的字符串。在一条小路上永远不会有逃脱的机会!你可以在硬编码的字符串前面放一个“r”作为raw,但据我所知,在变量前面不能这样做。