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

Python 从文件中删除非ASCII*行*?,python,linux,string,file,ascii,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的方法可以做到这一

有没有办法从文件中删除非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的方法可以做到这一点

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

grep-v
打印与模式不匹配的所有行
LC_ALL=C
将区域设置设置为“C”
$'[^\t\r-~]'
是一种模式,在C语言环境中,它表示“包含不是水平制表符、换行符、空格或ASCII字形字符的字符”。(
$'…'
是一种Bash表示法:它相当于
'…'
,只是它处理反斜杠转义,如
\t
\r
[^…]
是一个“负字符类”,意思是“任何未在
中列出的字符。在字符类中,
-
匹配一个范围:在本例中,从空格到波浪号的范围。C语言环境是理解此“范围”所必需的。”

给定字符串,如下一个:

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

若要删除空行,我将使用
re.sub('\n+','\n',s)

如果要删除包含任何非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
def ascii_行(可编辑):
对于iterable中的行:
如果所有(ord(ch)<128,用于ch串联):
生产线
f=打开('somefile.txt'))
对于ascii_行中的行(f):
打印行

实际上,您需要对数据做一些处理,并需要进一步解析它。如果您的文件
测试
如下所示

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']]

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

当您说“完整ASCII字符集”时,您的意思是它包含从0到127的每个字节值吗?所以这行可以包含删除、垂直制表符、表单提要、空字节等等,只要它的字节都不超过128个?你忘了测试
“asd\n123\xaa\xfa\xaf123\nqwe”
,你的版本会产生错误的结果。@glglglglgl,你当然是对的,事实上这就是我在测试答案时使用的。不知怎的,它在翻译中丢失了。
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']]