Python 从文件中读取并删除非ASCII字符

4

我有一个程序,逐个单词地读取文件,并将单词重新写入另一个文件,但不包括第一个文件中的非ASCII字符。

import unicodedata
import codecs
infile = codecs.open('d.txt','r',encoding='utf-8',errors='ignore')
outfile = codecs.open('d_parsed.txt','w',encoding='utf-8',errors='ignore')


for line in infile.readlines():
    for word in line.split():
        outfile.write(word+" ")
    outfile.write("\n")

infile.close()
outfile.close()

我遇到的唯一问题是,在这段代码中它没有将新行打印到第二个文件(d_parsed)中。有什么线索吗?

它有什么问题?它完美地工作了。 - bluefoggy
它不会像outfile.write("\n")一样换行。 - user1894963
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - mechanical_meat
5
附带说明:此代码不会删除非ASCII字符,而是删除无法使用“UTF-8”编码解码的字符。 - Lukas Graf
3个回答

11

codecs.open()不支持通用换行符,例如在Windows读取时它不会将\r\n转换为\n

请改用io.open()

#!/usr/bin/env python
from __future__ import print_function
import io

with io.open('d.txt','r',encoding='utf-8',errors='ignore') as infile, \
     io.open('d_parsed.txt','w',encoding='ascii',errors='ignore') as outfile:
    for line in infile:
        print(*line.split(), file=outfile)

顺便说一句,如果您想删除非ASCII字符,应该使用ascii而不是utf-8

如果输入编码与ASCII兼容(例如UTF-8),则可以以二进制模式打开文件,并使用bytes.translate()删除非ASCII字符:

#!/usr/bin/env python
nonascii = bytearray(range(0x80, 0x100))
with open('d.txt','rb') as infile, open('d_parsed.txt','wb') as outfile:
    for line in infile: # b'\n'-separated lines (Linux, OSX, Windows)
        outfile.write(line.translate(None, nonascii))

它不像第一个代码示例那样规范化空格。

bytes.translate() - 非常好 - Vor

2

来自 codecs.open文档:

注意:文件总是以二进制模式打开,即使没有指定二进制模式。这样做是为了避免由于编码使用8位值而导致的数据丢失。这意味着在读写时不会自动转换 '\n'。

我猜你正在使用Windows,其中换行序列实际上是 '\r\n'。在文本模式下打开的文件将自动将 \n 转换为 \r\n,但是使用 codecs.open 不会发生这种情况。

只需将 "\n" 替换为 "\r\n",在Windows上就应该可以正常工作。


-1
使用编解码器打开CSV文件,这样就可以避免非ASCII字符的问题。
 import codecs   
reader = codecs.open("example.csv",'r', encoding='ascii', errors='ignore')
    for reading in reader:
        print (reader)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接