包含特殊字符的字符串的绝对路径

时间:2018-11-24 06:13:09

标签: python

在我的代码中,我从数据库中获取了一个路径,该路径可能包含特殊的转义字符,我需要将其转换为真实的路径名。我在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))

4 个答案:

答案 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))