在我的代码中,我从数据库中获取了一个路径,该路径可能包含特殊的转义字符,我需要将其转换为真实的路径名。我在Windows上使用python 3.7。
假设此路径:C:\Files\2c2b2541\00025\test.x
重要:该路径在代码中不是固定值,而是从pyodbc
执行存储过程的输出。
当我尝试将其转换为绝对路径时,出现此错误:
ValueError:_getfullpathname:路径中嵌入了空字符
我也尝试用"\"
代替"/"
,但是没有运气。
import os
# path = cursor.execute(query, "some_input").fetchone()[0]
path = 'C:\Files\2c2b2541\00025\test.x'
print(os.path.abspath(path))
答案 0 :(得分:1)
我认为以下是解决问题的正确方法。
>>> def get_fixed_path(path):
... path = repr(path)
... path = path.replace("\\", "\\\\")
... path = path.replace("\\x", "\\\\0")
... path = os.path.abspath(path3).split("'")[1]
... return path
...
>>>
>>> path = 'C:\Files\2c2b2541\00025\test.x'
>>> path
'C:\\Files\x02c2b2541\x0025\test.x'
>>>
>>> print(path)
C:\Filesc2b2541 25 est.x
>>>
>>> final_path = get_fixed_path(path)
>>> final_path
'C:\\Files\\002c2b2541\\00025\\test.x'
>>>
>>> print(final_path)
C:\Files\002c2b2541\00025\test.x
>>>
这是上述解决方案中每个步骤/语句的详细说明。
第一步(问题)
>>> import os
>>>
>>> path = 'C:\Files\2c2b2541\00025\test.x'
>>> path
'C:\\Files\x02c2b2541\x0025\test.x'
>>>
>>> print(path)
C:\Filesc2b2541 25 est.x
>>>
第二步(问题)
>>> path2 = repr(path)
>>> path2
"'C:\\\\Files\\x02c2b2541\\x0025\\test.x'"
>>>
>>> print(path2)
'C:\\Files\x02c2b2541\x0025\test.x'
>>>
第三步(问题)
>>> path3 = path2.replace("\\", "\\\\")
>>> path3
"'C:\\\\\\\\Files\\\\x02c2b2541\\\\x0025\\\\test.x'"
>>>
>>> print(path3)
'C:\\\\Files\\x02c2b2541\\x0025\\test.x'
>>>
>>> path3 = path3.replace("\\x", "\\\\0")
>>> path3
"'C:\\\\\\\\Files\\\\\\002c2b2541\\\\\\00025\\\\test.x'"
>>>
>>> print(path3)
'C:\\\\Files\\\002c2b2541\\\00025\\test.x'
>>>
第四步(问题)
>>> os.path.abspath(path3)
"C:\\Users\\RISHIKESH\\'C:\\Files\\002c2b2541\\00025\\test.x'"
>>>
>>> os.path.abspath(path2)
"C:\\Users\\RISHIKESH\\'C:\\Files\\x02c2b2541\\x0025\\test.x'"
>>>
>>> os.path.abspath('k')
'C:\\Users\\RISHIKESH\\k'
>>>
>>> os.path.abspath(path3).split("'")
['C:\\Users\\RISHIKESH\\', 'C:\\Files\\002c2b2541\\00025\\test.x', '']
>>> os.path.abspath(path3).split("'")[1]
'C:\\Files\\002c2b2541\\00025\\test.x'
>>>
最后一步(解决方案)
>>> final_path = os.path.abspath(path3).split("'")[1]
>>>
>>> final_path
'C:\\Files\\002c2b2541\\00025\\test.x'
>>>
>>> print(final_path)
C:\Files\002c2b2541\00025\test.x
>>>
答案 1 :(得分:1)
从您对其他答案的评论来看,听起来好像您正在使用的数据库中的数据已损坏。也就是说,您在那里存储了一个原义的空字节,也许还有其他虚假字节(例如\2
可能变成了\x02
)。因此,您可能需要两个修复程序。
首先,您应该修复将值放入数据库中的所有代码,这样就不会再将假数据放入数据库中了。您尚未描述数据如何进入数据库,所以我们不能为您提供有关如何执行此操作的指导。但是大多数编程语言(和数据库库)都有工具来防止对不需要的转义序列进行字符串评估。
一旦停止添加新的不良数据,就可以修复数据库中已经存在的值。编写一个将\0
空字节替换为\\0
(或适用于您数据库的适当转义序列)的查询可能并不难。您可能还需要查找特殊字符,例如换行符(\n
和不可打印的字符(例如\x02
)。
如果您完全无法控制数据库,我只会尝试在输出端解决此问题。
答案 2 :(得分:0)
将“ \”替换为“ \\”。
就是这样。
答案 3 :(得分:-1)
您需要使用原始字符串文字或双反斜杠\\
。
import os
path = r'C:\Files\2c2b2541\00025\test.x' #r before the string
print(os.path.abspath(path))