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


    文件A中每一行格式为

    [16/08/17-10:16:39 100][.audioonline_waviat00000859@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+' '+'<s>'+' '+result+' '+'</s>'+' '+'.'+' ')
    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:

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

  • 相关阅读:
    阿里巴巴、腾讯、百度的面试问题笔知识汇总(两)
    ORM武器:NHibernate(三)五个步骤+简单对象CRUD+HQL
    SIGPIPE并产生一个信号处理
    Duanxx的Altium Designer学习:PCB试想一下,在目前的水平
    网络工程师课程---6、应用层(应用层的功能是什么)
    网络工程师课程---5、传输层(传输层常用协议有哪些)
    网络工程师课程---4、网络层(网关是什么)
    网络工程师课程---3、IP与路由器(ip地址的主要作用是什么)
    网络工程师课程---2、物理层和数据链路层(物理层的作用是什么)
    交换机与路由器与猫的区别与联系
  • 原文地址:https://www.cnblogs.com/lovely7/p/5779771.html
Copyright © 2020-2023  润新知