从文件中删除非ASCII *行*?
有没有办法可以从文件中删除非ASCII的行(而不是字符)呢?比如说,给我这样的内容:
Line 1 (full ASCII character set)
Line 2 (contains unicode characters)
Line 3 (full ASCII)
Line 4 (contains unicode characters)
我想要的是:
Line 1
Line 3
我知道可以用 iconv
来删除ASCII字符,但我想要的是删除任何包含非ASCII的行。有没有什么工具或者Python的方法可以做到这一点呢?
5 个回答
2
在实际操作中,你会想要对数据进行一些处理,因此需要进一步解析它。如果你的文件 test
看起来像这样:
http://example.com dog
http://example.com/å%20ä%20ö/ foo
http://google.com bar
一个 pyparsing
脚本可以像下面这样去掉不好的行:
from pyparsing import *
ParserElement.setDefaultWhitespaceChars(" \t")
EOL = LineEnd()
ascii = u''.join(unichr(x) for x in xrange(33,127))
words = Word(ascii)
good_line = Group(ZeroOrMore(words) + EOL)
bad_line = SkipTo(EOL,include=True)
blocks = good_line | bad_line.suppress()
grammar = ZeroOrMore(blocks) + StringEnd()
P = grammar.parseFile("test")
print P
这样处理后,输出结果会是:
[['http://example.com', 'dog', '\n'], ['http://google.com', 'bar']]
与其他方法相比(那些方法也能正常工作,并且回答了问题),这种方法的好处在于你现在有了一个漂亮的解析树,可以进一步操作数据。这个想法是为任何可能变得比最初开始时更复杂的任务编写一个 语法,而不是仅仅写一个解析器。
3
给定一个像下面这样的字符串:
>>> s = "asd\n\xaa\xfa\xaf\nqwe"
>>> print s
asd
╙З╞
qwe
你可以根据自己的标准简单地过滤它:
>>> s = filter(lambda x: ord(x) < 128, s)
>>> s
'asd\n\nqwe'
>>> print s
asd
qwe
你也可以通过转换为 unicode
来达到同样的效果:
>>> str(s.decode('ascii', 'ignore'))
'asd\n\nqwe'
要去掉空行,我会使用 re.sub('\n+', '\n', s)
。
4
如果你想去掉包含任何非ASCII字符的行:
def ascii_lines(iterable):
for line in iterable:
if all(ord(ch) < 128 for ch in line):
yield line
f = open('somefile.txt')
for line in ascii_lines(f):
print line