Удаление не-ASCII * строк * из файла? - PullRequest
2 голосов
/ 27 января 2012

Есть ли способ удалить строки, не являющиеся символами 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 строки. Есть ли полезный / питонный способ сделать это?

Ответы [ 5 ]

3 голосов
/ 27 января 2012

Если вы хотите исключить строки, содержащие любые символы, не относящиеся к 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
2 голосов
/ 27 января 2012

Данная строка выглядит следующим образом:

>>> 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 голосов
/ 27 января 2012
for line in fin:
    try:
        fout.write(line.encode('ASCII'))
    except UnicodeDecodeError:
        pass
1 голос
/ 27 января 2012

На практике вы захотите сделать что-то с данными, и вам нужно будет проанализировать их дальше. Если ваш файл 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']]

Преимущество перед другими методами (которые отлично работают и отвечают на вопрос), так как теперь у вас есть хорошее дерево разбора для дальнейшей обработки данных. Идея состоит в том, чтобы написать грамматику , а не анализатор, для любой задачи, которая может стать более сложной, чем при первом запуске.

1 голос
/ 27 января 2012
LC_ALL=C grep -v $'[^\t\r -~]'

grep -v печатает все строки, которые не соответствуют шаблону.LC_ALL=C устанавливает язык "C".$'[^\t\r -~]' - это шаблон, который в языке C означает «содержит символ, который не является горизонтальной табуляцией, переводом строки, пробелом или глифическим символом ASCII».($'...' является нотацией Bash: она эквивалентна '...', за исключением того, что она обрабатывает обратные слэши, такие как \t и \r. [^...] - это "класс отрицательных символов", что означает "любой символ, который не является"t указан в .... Внутри символьного класса - соответствует диапазону: в данном случае диапазон от пробела до тильды. Локаль C необходима для понимания этого «диапазона».)

...