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.')
原文地址:https://www.cnblogs.com/yjbjingcha/p/7099289.html