1. 程式人生 > >Python中可避免讀寫亂碼的一個強大方法

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.')