从大文件中删除少量行

时间:2014-06-24 18:22:48

标签: python unix

我有一个非常大的文本文件,其中大多数行由ASCII字符组成,但只有一小部分行具有非ASCII字符。创建仅包含ASCII行的新文本文件的最快方法是什么?现在我正在检查每一行中的每个字符以查看它是否为ASCII,如果所有字符都是ASCII,则将每一行写入新文件,但此方法相当慢。此外,我正在使用Python,但将来可以使用其他语言。

编辑:使用代码更新

#!/usr/bin/python

import string

def isAscii(s):
    for c in s:
        if ord(c) > 127 or ord(c) < 0:
            return False
    return True

f = open('data.tsv')
g = open('data-ASCII-only.tsv', 'w')

linenumber = 1
for line in f:
    if isAscii(line):
        g.write(line)
    linenumber += 1

f.close()
g.close()

3 个答案:

答案 0 :(得分:1)

你可以使用grep:“ - v”保持相反,-P使用perl regex语法,[\ x80- \ xFF]是非ascii的字符范围。

grep -vP "[\x80-\xFF]" data.tsv > data-ASCII-only.tsv

有关使用grep搜索ascii字符的更多信息,请参阅此问题How do I grep for all non-ASCII characters in UNIX

答案 1 :(得分:0)

以下建议使用命令行过滤器(即,您将在shell命令行上使用它),此示例适用于Linux或unix系统上的shell,也许OSX也是如此(我听说过OSX是BSDish):

$ cat big_file | tr -dc '\000-\177' > big_file_ascii_only

它使用&#34; tr&#34; (翻译)过滤器。在这种情况下,我们告诉tr&#34;删除&#34;所有字符都在八进制-000到八进制-177之外。您可能希望调整字符集 - 检查tr的手册页以获取有关指定要保留(或删除)字符的其他方法的一些想法

答案 2 :(得分:0)

如果且仅当文件是,则给出的其他方法将起作用 以这样的方式编码&#34;非ASCII&#34;相当于&#34;高位 set&#34;,例如Latin-1或UTF-8。这是Python 3中的一个程序 使用任何编码。

#!/usr/bin/env python3

import codecs

in_fname = "utf16file"
in_encoding = "utf-16"
out_fname = "ascii_lines"
out_encoding = "ascii"

def is_ascii(s):
    try:
        s.encode("ascii")
    except UnicodeEncodeError:
        return False
    return True

f_in = codecs.open(in_fname, "r", in_encoding)
f_out = codecs.open(out_fname, "w", out_encoding)

for s in f_in:
    if is_ascii(s):
        f_out.write(s)

f_in.close()
f_out.close()