||
转(别人在论坛上提出的问题)
我正在与一个txt文件。我想从文件中没有非ASCII字符的文本字符串。不过,我要离开的空间和时间。目前,我正在剥者也。下面的代码:
def onlyascii(char): if ord(char) < 48 or ord(char) > 127: return '' else: return chardef 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()留有空格和句点?我想这不是,但我不能弄明白。 谢谢。
1. 你可以过滤所有字符不属于string.printable,像这样的字符串:
>>> s = "somex00string. withx15 funny characters"
>>> import string
>>> filter(lambda x: x in string.printable, s)
'somestring. with funny characters'
string.printable我的机器上包含:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ tnrx0bx0c
2. 如果你想打印的ASCII字符,你可能应该纠正你的代码:
if ord(char) < 32 or ord(char) > 126: return ''
这是等价的,以string.printable(来自@jterrace答案),除了缺少回车和制表符的('\ T',为'\ n','\ X0B' CodeGo.net,'\ X0C'和'\ r'),但不对应的范围内对您的问题
3. 一个简单的方法来改变不同的编解码器,编码是()或解码()。在你的情况,你要转换为ASCII和忽略不支持的所有符号。例如,瑞典的字母A是不是一个ASCII字符:
>>>s = u'Good bye in Swedish is Hej dxc3'
>>>s = s.encode('ascii',errors='ignore')
>>>print s Good bye in Swedish is Hej d
4. 你的问题是结合在一起的前两句暗示你认为空间和“期间”都是非ASCII字符。这是不正确的。所有字符,这样奥德(炭)<=127是ASCII字符。例如,你的函数不包括这些字符“#$%&\'()* +,-。/但包括其他一些如[] {}。 请退后一步,想了一下,修改你的问题你正在尝试做什么,字的ASCII,以及为什么你认为字符,使得奥德(炭)>=128都将被忽略。另外:其中的Python版本?什么是你的输入数据的编码? 请注意,您的代码读取整个输入文件作为一个字符串,和你的(“伟大的解决方案”),以另一种答案意味着你不关心换行符在您的数据。如果您的文件包含两行是这样的:this is line 1this is line 2其结果将是'this is line 1this is line 2'...是你真正想要的? 更大的解决方案应包括:(1)一个比更好的过滤函数onlyascii(2)认识到,一个过滤器需要返回一个truthy值,如果要保留:def filter_func(char): return char == 'n' or 32 <= ord(char) <= 126# and later: filtered_data = filter(filter_func, data).lower()
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-22 09:58
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社