从文件中删除非ASCII *行*?

2 投票
5 回答
1597 浏览
提问于 2025-04-17 11:13

有没有办法可以从文件中删除非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

撰写回答