从Python字符串中删除u202a

3
我正在尝试在Python中打开一个文件,但是出现了错误,在字符串的开头我得到了一个/u202a字符... 有人知道如何去除它吗?
def carregar_uml(arquivo, variaveis):
    cadastro_uml = {}
    id_uml = 0

    for i in open(arquivo):
        linha = i.split(",")


carregar_uml("‪H:\\7 - Script\\teste.csv", variaveis)

OSError: [Errno 22] 参数无效:'\u202aH:\7 - Script\teste.csv'

/u202aLEFT-TO-RIGHT EMBEDDING 的 Unicode 控制字符。希望这个信息能够帮助您的搜索。 - Ryan Schaefer
8个回答

11
当你最初创建.py文件时,你的文本编辑器引入了一个不可打印字符。
考虑这一行:
carregar_uml("‪H:\\7 - Script\\teste.csv", variaveis)

我们需要仔细地选择字符串(包括引号),然后将其复制粘贴到交互式Python会话中:

$ python
Python 3.6.1 (default, Jul 25 2017, 12:45:09) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> "‪H:\\7 - Script\\teste.csv"
'\u202aH:\\7 - Script\\teste.csv'
>>> 

正如您所看到的,在H字符之前有一个U-202A代码点的字符。

正如其他人指出的那样,U-202A代码点处的字符是从左到右嵌入。回到我们的Python会话:

>>> s = "‪H:\\7 - Script\\teste.csv"
>>> import unicodedata
>>> unicodedata.name(s[0])
'LEFT-TO-RIGHT EMBEDDING'
>>> unicodedata.name(s[1])
'LATIN CAPITAL LETTER H'
>>> 

这进一步证实了您字符串中的第一个字符不是H,而是不可打印的LEFT-TO-RIGHT EMBEDDING字符。

我不知道您用什么文本编辑器创建程序。即使我知道,我可能也不是那个编辑器的专家。无论如何,您使用的某个文本编辑器在您不知情的情况下插入了U+202A。

一种解决方法是使用不会插入该字符并/或将非打印字符突出显示的文本编辑器。例如,在vim中,该行显示如下:

carregar_uml("<202a>H:\\7 - Script\\teste.csv", variaveis)

使用这种编辑器,只需删除"H之间的字符即可。

carregar_uml("H:\\7 - Script\\teste.csv", variaveis)

尽管这行看起来与你原来的代码相同,但我已删除有问题的字符。使用此行将避免你报告的 OSError 问题。


1
这是正确的答案。OP接受的答案之所以有效,仅仅是因为它让OP重新输入了字符串。 - Karl Knechtel

3
你可以使用以下示例代码来从文件路径中删除 u202a。最初的回答。
st="‪‪F:\\somepath\\filename.xlsx"    
data = pd.read_excel(st)

如果我尝试这样做,会出现OSError错误,具体原因如下:

Traceback (most recent call last):
  File "F:\CodeRepo\PythonWorkSpace\demo\removepartofstring.py", line 14, in <module>
    data = pd.read_excel(st)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\util\_decorators.py", line 188, in wrapper
    return func(*args, **kwargs)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\util\_decorators.py", line 188, in wrapper
    return func(*args, **kwargs)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\io\excel.py", line 350, in read_excel
    io = ExcelFile(io, engine=engine)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\io\excel.py", line 653, in __init__
    self._reader = self._engines[engine](self._io)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\io\excel.py", line 424, in __init__
    self.book = xlrd.open_workbook(filepath_or_buffer)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python37\lib\site-packages\xlrd\__init__.py", line 111, in open_workbook
    with open(filename, "rb") as f:
OSError: [Errno 22] Invalid argument: '\u202aF:\\somepath\\filename.xlsx'

最初的回答:但如果我这样做

    st="‪‪F:\\somepath\\filename.xlsx" 
    data = pd.read_excel(st.strip("‪u202a")) #replace your string here

Its working for me


1
问题在于文件的目录路径没有被正确读取。使用原始字符串将其作为参数传递,应该就可以解决问题。
carregar_uml(r'H:\7 - Script\teste.csv', variaveis)

它是否起作用了?请让我知道,因为我的回答被踩了。 - jose_bacoy
你能解释一下为什么错误是因为r'H:\7 - Script\teste.csv'等于'H:\\7 - Script\\teste.csv'吗? - Shashank Singh
2
它似乎对 OP 有效,可能是因为他重新输入了字符串,避免了非打印字符。 - Robᵩ
@singh,问题出在打开文件上。将其作为原始字符串传递使得打开命令可以将其视为一个完整的字符串,而不需要将其解析为目录路径。 - jose_bacoy
2
不,正如辛格指出的那样,这两种形式是等价的。如果这起作用,那只是因为用户重新输入了它,就像@Robᵩ的评论一样。 - jsbueno
我不清楚为什么在字符串字面值的开头会出现额外的Unicode字符(可能是特定于OP所用的文本编辑器?);将其转换为原始字符串字面值也不会有任何影响。 - chepner

0
以下是一个简单的函数,用于删除"\u202a"和"\u202c"字符。
您可以将任何想要删除的字符添加到列表中。
def cleanup(inp):
    new_char = ""
    for char in inp:
        if char not in ["\u202a", "\u202c"]:
            new_char += char
    return new_char

example = '\u202a7551\u202c'
print(cleanup(example)) # prints 7551

0

在编写硬盘驱动器名称时,请使用小写字母!不要使用大写字母!

例如)H: -> 错误 例如)h: -> 不是错误


0

我尝试了以上所有解决方案。问题在于当我们从左到右复制路径或任何字符串时,会添加额外的字符。它不会显示在我们的IDE中。这个额外添加的字符表示从右到左标记(RLM)https://en.wikipedia.org/wiki/Right-to-left_mark,也就是在复制文本时从右到左选择了文本。

请查看链接到我的答案的图片。enter image description here 我还尝试了从左到右复制,然后就不会添加这个额外的字符。因此,要避免这种问题,要么手动输入路径,要么从左到右复制。


0

或者你可以切掉那个字符

file_path = r"‪C:\Test3\Accessing_mdb.txt"
file_path = file_path[1:]
with open(file_path, 'a') as f_obj:
f_obj.write('some words')

0

尝试 strip(),

def carregar_uml(arquivo, variaveis):
    cadastro_uml = {}
    id_uml = 0

    for i in open(arquivo):
        linha = i.split(",")


carregar_uml("‪H:\\7 - Script\\teste.csv", variaveis)

carregar_uml = carregar_uml.strip("\u202a")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接