zoukankan      html  css  js  c++  java
  • 适当处理文件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:

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

  • 相关阅读:
    rsync+inotify实现实时同步,自动触发同步文件
    Linux下实现Rsync目录同步备份
    零基础学python-16.2 作用域法则
    零基础学python-16.1 作用域快速入门
    零基础学python-15.4 函数的多态vs对象的多态
    零基础学python-15.3 函数的定义、调用与多态
    零基础学python-15.2 分解函数
    零基础学python-15.1 为什么需要编写函数
    零基础学python-14.3 python的文档资源:help函数
    零基础学python-14.2 python的文档资源:文档字符串
  • 原文地址:https://www.cnblogs.com/lovely7/p/5779771.html
Copyright © 2011-2022 走看看