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

问题描述 投票:2回答:3

我有以下程序,通过字读取文件字,并再次写入字到另一个文件,但没有从第一个文件中的非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)。任何线索?

python encoding character-encoding utf
3个回答
7
投票

codecs.open()不支持通用换行符例如,它并没有转化\r\n而在Windows阅读\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字符,您应该使用asciiutf-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))

它不规范的空白,如第一个代码示例。


1
投票

docs for codecs.open

注:文件总是以二进制模式打开,即使没有指定二进制模式。这样做是为了避免数据丢失,由于使用8位值编码。这意味着,没有“\ n”的自动转换是在阅读和写作完成。

我相信你正在使用Windows,其中新行序列实际上是'\r\n'。一个文件在文本模式下打开将执行从\n转换为自动\r\n,但这并不与codecs.open发生。

简单地写"\r\n"代替"\n"的,它应该能正常运行,至少在Windows上。


0
投票

使用的编解码器来打开CSV文件,然后就可避免非ASCII字符

 import codecs   
reader = codecs.open("example.csv",'r', encoding='ascii', errors='ignore')
    for reading in reader:
        print (reader)
© www.soinside.com 2019 - 2024. All rights reserved.