Python中可避免讀寫亂碼的一個強大方法

來源:互聯網
上載者:User

標籤:

昨天在幫同學解析一批從網路上爬取的檔案時,遇到一個奇葩的問題,檔案本身的編碼是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.‘)

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Python中可避免讀寫亂碼的一個強大方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.