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

时间:2014-10-14 19:44:03

标签: python encoding character-encoding utf

我有以下程序逐字读取文件并将该字再次写入另一个文件但没有第一个文件中的非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)中打印新行。任何线索??

3 个答案:

答案 0 :(得分:6)

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)

btw,如果你想删除非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))

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

答案 1 :(得分:1)

来自docs for codecs.open

  

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

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

只需编写"\r\n"而不是"\n",它应该可以正常工作,至少在Windows上。

答案 2 :(得分:0)

使用编解码器打开csv文件,然后可以避免使用非ascii字符

 import codecs   
reader = codecs.open("example.csv",'r', encoding='ascii', errors='ignore')
    for reading in reader:
        print (reader)