【发布时间】: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' 不够聪明呢?