【问题标题】:Python escape characterPython 转义字符
【发布时间】:2013-09-08 10:31:11
【问题描述】:

我为此苦苦挣扎了几个小时,虽然我找到了解决方案,但我不喜欢它。 有没有内置的方法来解决这个问题:

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

如果您使用 'shutil' 并执行以下操作: shutil.copy(file_path, new_file_path)

效果很好。

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

f = open(file_path, encoding="utf8")

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

我尝试做所有这些,但我唯一能做的就是自定义函数“reconstruct_broken_string”。

    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'

谢谢

【问题讨论】:

  • 请将您的程序缩减为显示错误的最小可能完整程序。然后将该短程序复制粘贴到您的问题中。有关此调试技术的信息,请参阅SSCCE.ORG
  • 您可以使用对str.translate的唯一调用来简化reconstruct_broken_string(如果您使用的是python3)。只需更改backslash_map,使键成为*代码点*(即ord('\a'): r'\a')并调用file_path.translate(backslash_map)
  • 我试过这个没有用:backslash_map = {ord('\a') : r'\a'} then: file_path.translate(backslash_map)
  • 让我们换个角度试试。你说open()“不起作用”。你能扩展一下吗? open() 返回什么?它会引发异常吗?如果是这样,你能复制粘贴准确的错误信息吗?
  • 'Open' 找不到文件,因为路径中的 '\a' 被视为转义字符(bell,即 7)。为什么“打开”甚至在传递给它的路径中寻找转义字符。传递给“Shutil”以复制文件的变量中的相同路径工作正常。 'Shutil' 足够聪明,不会在路径中寻找转义字符,为什么'Open' 不够聪明呢?

标签: python path escaping


【解决方案1】:

你的问题出在这一行:

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 接受正斜杠作为文件分隔符。)

参考:http://docs.python.org/2/reference/lexical_analysis.html#string-literals

【讨论】:

  • 或使用正斜杠。具体来说,它是 \a 转义。
  • 是的,但是路径在我在运行时获得的变量中,我不能在变量名前面添加“r”。
  • 请编辑您的问题以包含初始化该变量的代码。
  • 初始化变量的代码是文件浏览器窗口的返回值。我无法控制它。
  • 您使用的是什么图形工具包?能否提供一个使用该工具包并重现错误的琐碎小程序?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这是一个简化版本,演示了“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-tab、escape-newline 等,但它不适用于作为 escape bell 的 '\a'。

    这是“repr”中的错误吗? 是否有不需要程序员编写像“reconstruct_broken_string(s)”这样的自定义函数来解决这个问题的内置解决方案? 如果不是,python怎么会这么蹩脚?

    【讨论】:

    • 同样,this 程序的问题在于file_path = "F:\tab\a_bell\newline.py" 行。该字符串文字中有一个制表符、一个铃铛和一个换行符。如果您希望它们成为字符串中的斜线,则必须将它们转义 '\\' 或使用原始字符串 r'f:\tab ...'。但我怀疑这不是你真正的程序的问题,因为你在其他地方说过你没有赋值语句。
    • repr 在这个程序中运行良好。 repr() 返回一个字符串,如果将其传递给 eval() 将产生原始值。
    • 在这里查看我的测试示例:file_path = "F:\tab\a_bell\newline.py" tab 中的 '\t' 被 repr 正确处理,'\n' 被正确处理,但 '\a' 没有。为什么 repr 对字符串中的所有转义字符都不正确?
    • repr 的输出是正确的。 \t 是制表符,\n 是换行符,\x07 是警告字符。但是,你为什么在乎?你在用repr() 做什么?我很难想象在任何情况下您都可以在程序中合法地使用 repr() 函数。
    • 如果您看上面,我尝试了很多方法来解决“打开”将路径中的反斜杠视为转义的问题。我用谷歌搜索过这个问题,无数人遇到过同样的问题,但尽管所有人都遇到过类似的问题,但我还没有找到一个“已解决”的问题。问题真的很简单:为什么'Open'将反斜杠视为转义,而它应该只查看作为路径传递给它的字符串。路上永远没有逃生的机会!你可以在硬编码字符串前面加一个 'r' 表示 raw,但据我所知,你不能在变量前面这样做。
    【解决方案4】:

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

    【讨论】:

    • 怎么样?我试过 file_path.replace('\\','/') 你必须加倍转义字符否则它不会运行,它打印出来为: F:\ScriptsFilePathddons\import_test.py
    【解决方案5】:

    我遇到了同样的问题 - 尝试了 path = 'C:\temp\importfile.xlsx' 并不断收到错误 "No such file or directory: 'C:\\Temp\\importdata.xlsx'"。我改用正斜杠,我的导入工作。你试过file_path = "F:/ScriptsFilePath/addons/import_test.py"吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多