zoukankan      html  css  js  c++  java
  • Python中可避免读写乱码的一个强慷慨法

    昨天在帮同学解析一批从网络上爬取的文件时,遇到一个奇葩的问题,文件本身的编码是gbk,Eclipse编辑环境的默认编码是utf8,使用常规的open方法批量打开文件时,某些文件里存在一些不可被gbk识别的特殊字符导致读取错误,而这些特殊字符又是存在于utf8编码中的。经不断尝试,发现一个非常好的解决的方法:使用Python自带的codecs。codecs就是为编码转码而生的,关于此功能的很多其它详情请移步 https://docs.python.org/3.2/library/codecs.html

    # -*- coding: utf8 -*- 
    #下面代码要实现的效果是将gbk编码的文件批量转存为utf8编码的文件
    import os;
    import codecs;
    from bs4 import BeautifulSoup;
    
    #以gb18030编码读文件的函数
    def ReadFile(filePath,encoding="gb18030"): #注意这里的编码格式
        with codecs.open(filePath,"r",encoding) as f:
            return f.read()
    
    #以utf8编码又一次写文件的函数 
    def WriteFile(filePath,u,encoding="utf-8"):
        with codecs.open(filePath,"w",encoding) as f:
            f.write(u)
    
    fileList=os.listdir("E:/content/"); #获取原文件列表
    for eachFile in fileList: #遍历文件名称
        temp=ReadFile("E:/content/"+eachFile); #读文件
        WriteFile('E:/content_0629/'+eachFile, temp, "utf8"); #将读取的内容转存为utf8编码的文件
    print('finished.')

    另外,文件完毕转存之后。在使用BeautifulSoup进行解析时,想过滤掉一些噪声信息,完整代码例如以下:

    # -*- coding: utf8 -*- 
    import os;
    from bs4 import BeautifulSoup;
    n=0;
    
    fileList=os.listdir("E:/content_0629");
    for eachFile in fileList:
        n=n+1; #设置文件序号
    
        rawText= open(r"E:/content_0629/"+eachFile,'r',encoding='utf8');#读文件
        bs4Text=BeautifulSoup(rawText);#调用BeautifulSoup进行解析
    
        title=bs4Text.find('h2'); #h2标签中放的是文章正文标题
        if(title==None): #推断标题标签是否存在。假设不存在则忽略当前文件
            continue;
        else:
            title=title.get_text(); #获取标题内容文本
            title=title.replace(" ","");#替换掉当中的全角空格
            title=title.replace(" ","");#替换掉当中的半角空格        
    
        mainContent=bs4Text.find('div',{'class':'content'}); #依据标签名和标签属性值获取正文内容标签
        if(mainContent==None):#推断此标签是否存在。假设不存在则忽略当前文件
            continue;
        else:
            mainContent=mainContent.get_text();
            mainContent=mainContent.replace(" ","");
            mainContent=mainContent.replace(" ","");
            mainContent=mainContent.replace("	","");
            mainContent='
    '.join(mainContent.split()) #将多个连续的空行替换为一个空行
    
        #将解析后的文本保存到文件里。仍以utf8编码
        fwriter=open('E:/result_0629/resutl_'+str(n)+".txt",'w',encoding='utf8');
        fwriter.write(title+"
    "+mainContent);
        fwriter.close();    
    
    print('finished.')
  • 相关阅读:
    操作MySQL数据库相关代码
    JSP(1)
    servlet(6)
    servlet(5)
    Java易错知识点(2)
    Java Web项目中解决中文乱码方法总结
    Java易错知识点(1)
    servlet(4)
    TCP协议之三次握手四次挥手
    day-4 map&filter
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7099289.html
Copyright © 2011-2022 走看看