Python中可避免讀寫亂碼的一個強大方法
阿新 • • 發佈:2018-11-10
昨天在幫同學解析一批從網路上爬取的檔案時,遇到一個奇葩的問題,檔案本身的編碼是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.')