6

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

您在 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”而不是“开放”

谢谢

4

5 回答 5

12

您的问题出在这一行:

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

于 2013-09-08T10:36:38.830 回答
0

这是一个简化版本,演示了“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)”这样的自定义函数来解决这个问题的内置解决方案?如果不是,蟒蛇怎么会这么蹩脚?

于 2013-09-08T19:44:28.277 回答
0

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

于 2013-12-20T15:35:31.263 回答
0

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

于 2013-09-08T13:41:36.160 回答
0

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

filePath = input()
try:
    print(filePath)
except:
    print(r""+filePath)
于 2018-07-17T21:25:55.540 回答