我正在使用.txt文件。我想要一个文件的字符串,没有非ASCII字符。但是,我想留下空格和句号。目前,我也正在剥离它们。这是代码:
def onlyascii(char):
if ord(char) < 48 or ord(char) > 127: return ''
else: return char
def get_my_string(file_path):
f=open(file_path,'r')
data=f.read()
f.close()
filtered_data=filter(onlyascii, data)
filtered_data = filtered_data.lower()
return filtered_data
如何修改onlyascii()以留出空格和句点?我想这不是太复杂但我无法弄明白。
答案 0 :(得分:154)
您可以使用string.printable过滤字符串中无法打印的所有字符,如下所示:
>>> s = "some\x00string. with\x15 funny characters"
>>> import string
>>> printable = set(string.printable)
>>> filter(lambda x: x in printable, s)
'somestring. with funny characters'
我机器上的string.printable包含:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c
答案 1 :(得分:71)
更改为不同编解码器的简单方法是使用encode()或decode()。在您的情况下,您希望转换为ASCII并忽略所有不受支持的符号。例如,瑞典字母å不是ASCII字符:
>>>s = u'Good bye in Swedish is Hej d\xe5'
>>>s = s.encode('ascii',errors='ignore')
>>>print s
Good bye in Swedish is Hej d
修改强>
Python3:str - &gt; bytes - &gt; STR
>>>"Hej då".encode("ascii", errors="ignore").decode()
'hej d'
Python2:unicode - &gt; str - &gt;的unicode
>>> u"hej då".encode("ascii", errors="ignore").decode()
u'hej d'
Python2:str - &gt; unicode - &gt; str(以相反顺序解码和编码)
>>> "hej d\xe5".decode("ascii", errors="ignore").encode()
'hej d'
答案 2 :(得分:21)
根据@artfulrobot,这应该比filter和lambda更快:
re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string)
答案 3 :(得分:7)
你的问题含糊不清;前两个句子一起表示你认为空格和“句号”是非ASCII字符。这是不正确的。所有字符,例如ord(char)&lt; = 127是ASCII字符。例如,您的函数会排除这些字符!“#$%&amp; \'()* +, - 。/但包含其他几个字符,例如[] {}。
请退后一步,想一想,编辑你的问题,告诉我们你要做什么,不提ASCII字,以及为什么你认为ord(char)&gt; = 128这样的字符是可以忽略的。另外:哪个版本的Python?输入数据的编码是什么?
请注意,您的代码将整个输入文件作为单个字符串读取,而您对另一个答案的评论(“出色的解决方案”)意味着您不关心数据中的换行符。如果您的文件包含两行,如下所示:
this is line 1
this is line 2
结果将是'this is line 1this is line 2'
......这是你真正想要的吗?
更好的解决方案包括:
onlyascii
认识到如果要保留参数,过滤函数只需要返回一个真值:
def filter_func(char):
return char == '\n' or 32 <= ord(char) <= 126
# and later:
filtered_data = filter(filter_func, data).lower()
答案 4 :(得分:1)
如果您想要可打印的ascii字符,您可能应该将代码更正为:
if ord(char) < 32 or ord(char) > 126: return ''
这相当于string.printable
(来自@jterrace的回答),除了没有返回和制表符('\ t','\ n','\ x0b','\ x0c'和' \ r')但不符合您问题的范围
答案 5 :(得分:1)
您可以使用以下代码删除非英语字母:
import re
str = "123456790 ABC#%? .(朱惠英)"
result = re.sub(r'[^\x00-\x7f]',r'', str)
print(result)
这将返回
123456790 ABC#%? 。()
答案 6 :(得分:0)
通过Fluent Python(Ramalho)工作 - 强烈推荐。 受第2章启发的列表理解一线作家:
onlyascii = ''.join([s for s in data if ord(s) < 127])
onlymatch = ''.join([s for s in data if s in
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'])