Python中可避免读写乱码的一个强大方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/laoyaotask/article/details/46694911

昨天在帮同学解析一批从网络上爬取的文件时,遇到一个奇葩的问题,文件本身的编码是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("\t","");
        mainContent='\n'.join(mainContent.split()) #将多个连续的空行替换为一个空行

    #将解析后的文本保存到文件中,仍以utf8编码
    fwriter=open('E:/result_0629/resutl_'+str(n)+".txt",'w',encoding='utf8');
    fwriter.write(title+"\n"+mainContent);
    fwriter.close();    

print('finished.')

猜你喜欢

转载自blog.csdn.net/laoyaotask/article/details/46694911