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("\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.')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值