我有以下程序,通过字读取文件字,并再次写入字到另一个文件,但没有从第一个文件中的非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)。任何线索?
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字符,您应该使用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))
它不规范的空白,如第一个代码示例。
注:文件总是以二进制模式打开,即使没有指定二进制模式。这样做是为了避免数据丢失,由于使用8位值编码。这意味着,没有“\ n”的自动转换是在阅读和写作完成。
我相信你正在使用Windows,其中新行序列实际上是'\r\n'
。一个文件在文本模式下打开将执行从\n
转换为自动\r\n
,但这并不与codecs.open
发生。
简单地写"\r\n"
代替"\n"
的,它应该能正常运行,至少在Windows上。
使用的编解码器来打开CSV文件,然后就可避免非ASCII字符
import codecs
reader = codecs.open("example.csv",'r', encoding='ascii', errors='ignore')
for reading in reader:
print (reader)