我有一个非常大的文本文件,其中大多数行由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()
答案 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()