我已经挣扎了好几个小时,虽然我找到了解决办法,但我不喜欢它。 有没有内置的解决方法:
您在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'
由于
答案 0 :(得分:10)
你的问题就在这一行:
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
答案 1 :(得分:1)
这是一个简化版本,演示'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等,但它不适用于'\ a',它是转义铃。
这是'repr'中的错误吗? 是否有一个内置的解决方案,不需要程序员编写自定义函数,如'reconstruct_broken_string(s)'? 如果没有,蟒蛇怎么会这么蹩脚?
答案 2 :(得分:0)
如果路径在变量中,只需使用Python的任何字符串操作函数将所有'\'替换为'/'。它应该解决问题。
答案 3 :(得分:0)
我遇到了同样的问题 - 尝试过path ='C:\ temp \ importfile.xlsx'并且不断收到错误“没有这样的文件或目录:'C:\ Temp \ importdata.xlsx'”。我使用正斜杠代替我的导入工作。你试过file_path =“F:/ScriptsFilePath/addons/import_test.py”吗?
答案 4 :(得分:0)
您可以在字符串前面使用r,以便Python将其作为原始字符串处理-
filePath = input()
try:
print(filePath)
except:
print(r""+filePath)