适当处理文件A中字符串,split(),保存在文件B中,以及遇到UnicodeDecodeError处理方法

文件A中每一行格式为

[16/08/17-10:16:39 100][.\audio\online_wav\iat00000859@gz3c7f08769174462f00.pcm][2][51320006db03][(null)][62]:一年至少不3次

处理为文件B格式

iat00000859@gz3c7f08769174462f00.pcm
<s>
一年至少不3次
</s>
.

 

最初版,可以处理,但是会有问题

#encoding=utf-8
from __future__ import unicode_literals 
import os
import sys

reload(sys)

sys.setdefaultencoding('utf8')
sys.setdefaultencoding('gb18030')
# Python的str默认是ascii编码,和unicode编码冲突
# 解决UnicodeDecodeError: 
# ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128
# UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 35: invalid
#  start byte
# 解决办法:
# 在报错的页面添加代码: import sys 
# reload(sys) 
# sys.setdefaultencoding('gb18030')
'''----------迭代读取文件---------------'''
filename = raw_input('enter file name:')
f = open(filename,'r')
'''--------------------输出到文件-------------'''
filename = raw_input('enter file name:')
fobj = open(filename,'w')
#会覆盖原文件
for eachLine in f:
    print eachLine,
    line1 = eachLine.split('online_wav\\')[1].split(']',1)[0]
    line2 = '<s>'
    line3 = eachLine.split(':',3)[3]
    line4 = '</s>'
    line5 = '.'
    print line3
    fobj.write('%s%s%s%s%s%s%s%s%s' % (line1,os.linesep,line2,os.linesep,line3,line4,os.linesep,line5,os.linesep))

 

-----------------------------------------------------------------------------

借鉴版本

import os
import re
import sys

f=open(sys.argv[1],'r')
lines=f.readlines()
f.close()
temp = []
for eachline in lines:
pcm = eachline.strip().split('\\')[-1].split(']')[0]
result = eachline.strip().split(':')[-1]
temp.append(pcm+'\n'+'<s>'+'\n'+result+'\n'+'</s>'+'\n'+'.'+'\n')
f=open(sys.argv[2],'w')
f.writelines(temp)
f.close()

 

----------------------------------------------------------

最终版

#encoding=utf-8
import os
filename = raw_input('enter file name:')
f = open(filename,'r')
lines = f.readlines()
'''--------------------输出到文件-------------'''
filename = raw_input('enter file name:')
fobj = open(filename,'w')
#会覆盖原文件
for eachLine in lines:
    line1 = eachLine.split('online_wav\\')[1].split(']',1)[0]
    line2 = '<s>'
    line3 = eachLine.split(':',3)[3]
    line4 = '</s>'
    line5 = '.'
    fobj.write('%s%s%s%s%s%s%s%s%s' % (line1,os.linesep,line2,os.linesep,line3,line4,os.linesep,line5,os.linesep))

 

 

总结:lines = f.readlines()

for eachLine in lines: 就不会出现UnicodeDecodeError: 
# ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128这种问题

但是利用for eachLine in f:

就会出现各种编码不正确的问题

posted @ 2016-08-17 14:04  zdmlcmepl  阅读(269)  评论(0编辑  收藏  举报