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

时间:2012-01-27 15:35:09

标签: python linux string file 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行的行。是否有实用/ pythonic方法来做到这一点?

5 个答案:

答案 0 :(得分:3)

如果要删除包含任何非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

答案 1 :(得分:2)

给出类似下一个的字符串:

>>> 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)

答案 2 :(得分:2)

for line in fin:
    try:
        fout.write(line.encode('ASCII'))
    except UnicodeDecodeError:
        pass

答案 3 :(得分:1)

LC_ALL=C grep -v $'[^\t\r -~]'

grep -v打印匹配模式的所有行。 LC_ALL=C将语言环境设置为“C”。 $'[^\t\r -~]'是一种模式,在C语言环境中,表示“包含不是水平制表符,换行符,空格或ASCII字形字符的字符”。 ($'...'是一个Bash表示法:它等同于'...',但它会处理反斜杠转义,例如\t\r[^...]是一个“否定字符” class“,表示”...中未列出的任何字符。在字符类中,-匹配范围:在这种情况下,从空格到波浪号的范围.C语言环境是必需的理解这个“范围”。)

答案 4 :(得分:1)

在实践中,您需要对数据进行某些操作,并需要进一步解析它。如果您的文件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']]

其他方法的优势(工作正常,并回答问题),因为你现在有一个很好的解析树来进一步操纵数据。我们的想法是为任何有可能在首次启动时变得更加复杂的任务编写语法,而不是解析器。