[英]Deleting Non-ASCII *lines* from a file?
有没有办法从文件中删除非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字符的行:
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
给出下一个字符串:
>>> 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)
。
for line in fin:
try:
fout.write(line.encode('ASCII'))
except UnicodeDecodeError:
pass
LC_ALL=C grep -v $'[^\t\r -~]'
grep -v
打印所有与模式不匹配的行。 LC_ALL=C
将语言环境设置为“C”。 $'[^\\t\\r -~]'
是一种模式,在C语言环境中,表示“包含不是水平制表符,换行符,空格或ASCII字形字符的字符”。 ( $'...'
是一个Bash表示法:它等同于'...'
,除了它处理反斜杠 - 转义符如\\t
和\\r
。 [^...]
是一个“负字符类”,意思是“任何未列在...
的字符。在字符类中, -
匹配范围:在这种情况下,从空格到波浪号的范围.C语言环境是理解这个”范围“所必需的。)
在实践中,您将需要对数据执行某些操作,并需要进一步解析它。 如果你的文件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']]
其他方法的优点(工作正常,并回答问题),因为你现在有一个很好的解析树来进一步操纵数据。 我们的想法是为任何有可能在首次启动时变得更加复杂的任务编写语法而不是解析器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.