如果我有一个名为mystring的字符串并存储在其中:Ümeå我想将非ascii字符Üå存储在列表中。
下面是我的代码,它几乎正常工作,但列表包含十六进制字符(即\ xc3 \ xa6),而不是正确编码的字符:
try:
mystring.iloc[i].decode('ascii')
i+=1
except:
nonascii_string = str(mystring.iloc[i])
j=0
#now we've found the string, isolate the non ascii characters
for item in str(profile_data_nonascii_string):
try:
str(nonascii_string[j].decode('ascii'))
j+=1
except:
# PROBLEM: Need to work out how to encode back to proper UTF8 values
nonascii_chars_list.append(str(nonascii_string[j]))
j+=1
i+=1
pass
我想我需要做一些事情:
chr(profile_data_nonascii_string[j].encode('utf-8'))
但当然这样做只会选择我的多字节字符的第一个字节(因此会抛出错误)。我相信有一个简单的解决方案......: -
答案 0 :(得分:2)
以下是我如何将非ASCII字符与字符串中的示例字符串分开:
In [7]: s=u'Ümeå'
In [8]: print s
Ümeå
In [9]: s2 = u''.join(x for x in s if ord(x) > 126)
In [10]: print s2
Üå
或者,如果您更喜欢列表中的答案:
In [15]: s=u'Ümeå'
In [16]: print s
Ümeå
In [17]: s2 = list(x for x in s if ord(x) > 126)
In [18]: print s2[0]
Ü
In [19]: print s2[1]
å
答案 1 :(得分:0)
如果要删除字符,可以创建映射,并从字符串中str.translate
创建映射:
In [29]: tbl = dict.fromkeys(range(128), u"")
In [30]: s = u'Ümeå'
In [31]: print(s.translate(tbl))
Üå
在你似乎使用的熊猫中,你可以使用pandas.Series.str.translate。
Series.str.translate(table,deletechars = None)
通过给定的映射表映射字符串中的所有字符。相当于标准的str.translate()。请注意,可选参数deletechars仅在使用python 2时才有效。对于python 3,应通过table参数指定字符删除。
translate
将比str.join
更有效率:
In [7]: s = 'Ümeå' * 1000
In [8]: timeit ''.join([x for x in s if ord(x) > 127])
1000 loops, best of 3: 489 µs per loop
In [9]: timeit s.translate(tbl)
1000 loops, best of 3: 289 µs per loop
In [10]: s.translate(tbl) == ''.join([x for x in s if ord(x) > 127])
Out[10]: True
对于使用python2的pandas,你需要deletechars
和None:
In [2]: import pandas as pd
In [3]: raw_data = {'Name' : pd.Series(['david','åndrëw','calvin'], index=['a', 'b', 'c'])}
In [4]: df = pd.DataFrame(raw_data, columns = ['Name'])
In [5]: delete = "".join(map(chr,range(128)))
In [6]: print df['Name'].str.translate(None, delete)
a
b åë
c
Name: Name, dtype: object
对于使用dict的python3工作正常:
In [9]: import pandas as pd
In [10]: raw_data = {'Name' : pd.Series(['david','åndrëw','calvin'], index=['a', 'b', 'c'])}
In [11]:
In [11]: df = pd.DataFrame(raw_data, columns = ['Name'])
In [12]:
In [12]: delete = dict.fromkeys(range(128), "")
In [13]: df['Name'].str.translate(delete)
Out[13]:
a
b åë
c
Name: Name, dtype: object
记录了所需的不同方法:
参数:
table:dict(python 3),str或None(python 2) 在python 3中,table是Unicode序数到Unicode序数,字符串或None的映射。未映射的字符保持不变。映射到“无”的字符将被删除。 str.maketrans()是用于制作转换表的辅助函数。在python 2中,table是长度为256或None的字符串。如果表参数为None,则不应用任何转换,操作只删除deletechars中的字符。 string.maketrans()是用于制作转换表的辅助函数。 deletechars:str,optional(python 2) 要删除的字符串。此参数仅在python 2中有效。