Python基礎 | 資料檔案的讀寫
目錄
- txt
- txt的讀入
- txt的寫出
- csv
- xls\xlsx
- 線上網頁資料
- 常用的工具
- 爬蟲的步驟
- pdf
- pdfrw
- PyPDF2
- 提取文件資訊
- word文件
- 其他統計軟體生成檔案
本文總結使用Python對常見的資料檔案進行讀寫操作。
- 本文所用的示例資料下載,提取碼: sjgz
- pandas官網的資料I/O部分是很好的學習材料
txt
關於一般檔案讀寫的更多參考
txt的讀入
## 檔案讀取 # 檔案路徑 file_in = os.path.join(workdir,'Data/demo_text.txt') # 開啟檔案 f_in = open(file_in, encoding='utf-8') # 將每行的文字讀取,並存為列表 # 此處使用.rstrip()去除右側的空格、換行符等 lines_raw = [x.rstrip() for x in f_in] # 或者 # lines_raw = [l.rstrip() for l in f.readlines()] print(lines_raw) # 關閉檔案 f_in.close()
如果txt內部儲存的是表格(dataframe)格式的資料,那麼可以直接用pandas.read_csv
來讀取。
df_txt = pd.read_csv(file_in, names=['txt'], encoding='utf-8')
df_txt.head()
txt的寫出
# 檔案輸出 file_out = os.path.join(workdir,'Data/out_text.txt') f_out = open(file_out, encoding='utf-8',mode = 'w') f_out.writelines(lines_raw) f_out.close()
上面的列子是一次寫入所有行。
也可以使用.writeline
方法一行一行寫入,比如寫log日誌。
# 程式執行的日誌
file_log = os.path.join(workdir,'Data/run_log.txt')
f_log = open(file_log, encoding='utf-8',mode = 'w')
for i in range(5):
line = 'this is %d run \n'%i
f_log.write(line)
f_log.close()
csv
csv即逗號分隔的檔案,可以使用的包
- pd.read_csv
- csv
pandas
在資料分析中最常用,功能也很強大,這裡只示範pandas的用法
# 定義檔案路徑
file_csv = os.path.join(workdir,'Data/demo_csv.csv')
# pandas.read_csv()函式來讀取檔案
df_csv = pd.read_csv(file_csv,sep=',',encoding='utf-8')
# dataframe.to_csv()儲存csv檔案
# 儲存檔案的時候一定要注意encoding
df_csv.to_csv('out_csv',index=False,encoding='utf-8')
也可以用來讀取線上的檔案,檔案的字尾可能是txt、data之類的,不過沒關係,只要裡面存的是表格(dataframe)格式的資料,就可以用pandas.read_csv
來讀取。
#此處使用UCI機器學習用的資料
url_data = 'https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data'
# 欄位描述見https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.names
df_adult = pd.read_csv(url_data, sep=',', names = col_names,index_col=None)
xls\xlsx
pandas工具包中也提供了相應的函式來讀寫excel檔案(pandas.read_excel()
和dataframe.to_excel()
)。
更多參考
不同於csv檔案,xlsx檔案中會有多個sheet,pandas.read_excel函式預設讀取第一個sheet.
# 定義檔案路徑
file_excel = os.path.join(workdir,'Data/demo_xlsx.xlsx')
# pandas.read_excel()函式來讀取檔案
# sheet_name=0表示讀取第一個sheet,也可以指定要讀取的sheet的名稱(字串格式)
# header=0 表示使用第一行作為表頭(列名)
# 如果資料中沒有列名(表頭),可以設定header=None,同時names引數來指定list格式的列名
df_excel = pd.read_excel(file_excel,sheet_name=0,header=0,encoding='utf-8')
# dataframe.to_csv()儲存csv檔案
# 儲存檔案的時候一定要注意encoding
df_excel.to_excel('out_excel.xlsx',index=False,encoding='utf-8')
如果我們是想在單元格顆粒度上進行操作,可以考慮兩個工具包:
- xlwings
- openpyxl
這裡用xlwings示範自動化“填表”,比如現在有3個專案對應的3個單元格需要填寫。
@w=500
如果要批量從多個統一格式的excel檔案中讀取多個單元格或者寫入資料,可參考如下程式碼。
import xlwings as xw
file_excel = os.path.join(workdir,'Data/demo_填表.xlsx')
# 開啟excel檔案的時候不要展示頁面
app = xw.App(visible=False)
# 開啟工作簿
wb = xw.Book(file_excel)
# 開啟工作表
# 可以用index,可以指定sheet的名稱
ws = wb.sheets[0]
# 讀取對應單元格的值
print(ws.range('A1').value)
ws.range('B1').value = 'Ahong'
ws.range('B2').value = '男'
ws.range('B3').value = 'Pyhon'
# 儲存工作簿
wb.save()
# 也可以儲存為新的檔名,e.g.wb.save('new.xlsx')
# 關閉工作簿
wb.close()
線上網頁資料
線上網頁資料通常需要網路爬蟲來抓取,同時網頁是半結構化的資料,需要整理為結構化的資料。
關於網路爬蟲可以參考如下兩本書:
- Web Scraping with Python: Collecting More Data from the Modern Web, Ryan Mitchell, O’Reilly書系,中文版是Python網路爬蟲權威指南
- Python 3網路爬蟲開發實戰,崔慶才,也可以訪問作者的部落格
常用的工具
網頁資料的爬取和解析常會用到的工具包
requests
- BeautifulSoup
- lxml, 解析網頁中的css目錄很好用
- re,正則化是資料清洗中必學的技能之一,更多參考
- json,json和html是常見的半結構化資料
pandas,主要是對結構化的資料(dataframe)進行處理
爬蟲的步驟
通常網路爬蟲的步驟如下:
- 分析網頁請求規範,比如是get還是post,請求的url是啥,返回的資料是什麼格式(json?靜態html?),header引數,url或者post中的變數有什麼等;
- 獲取網頁資料,使用requests包;
- 解析網頁資料(將半結構化的網頁資料轉化為結構化資料),BeautifulSoup、lxml、re、json齊上陣;
- 整合資料並存檔,使用pandas對資料進行整合並初步清洗。
參考資料:
- https://automatetheboringstuff.com/chapter13/
- https://www.binpress.com/manipulate-pdf-python/
對於pdf檔案而言,如果要對文件操作(比如合併、篩選、刪除頁面等),建議使用的工具包:
- PyPDF2
- pdfrw
處理pdf檔案時,要注意檔案需要是“無密碼”狀態,“加密”狀態的檔案處理時會報錯。
pdf解密工具推薦:
- http://freemypdf.com/
- https://smallpdf.com/unlock-pdf
這裡舉例說明兩個包的用法:篩選奇數頁面並儲存為新文件。
pdfrw
from pdfrw import PdfReader
pdf_r = PdfReader(os.path.join(workdir,'Data/demo_pdf.pdf'))
from pdfrw import PdfWriter
pdf_w = PdfWriter()
page_cnt = pdf_r.numPages
# 篩選奇數頁面
for i in range(0,page_cnt,2):
pdf_w.addpage(pdf_r.pages[i])
pdf_w.write('filtered_pages.pdf')
y.write('dd.pdf')
PyPDF2
import PyPDF2
# 讀入檔案路徑
file_in = os.path.join(workdir,'Data/demo_pdf.pdf')
# 開啟要讀取的pdf檔案
f_in = open(file_in,'rb')
# 讀取pdf文件資訊
pdfReader = PyPDF2.PdfFileReader(f_in)
# pdf檔案頁面數
page_cnt = pdfReader.getNumPages()
pdfWriter = PyPDF2.PdfFileWriter()
# 篩選奇數頁面
for page_idx in range(0,page_cnt,2):
page = pdfReader.getPage(page_idx)
pdfWriter.addPage(page)
# 輸出文件
file_out = open('pdf_out.pdf', 'wb')
pdfWriter.write(file_out)
# 關閉輸出的檔案
file_out.close()
# 關閉讀入的檔案
# pdf_file.close()
提取文件資訊
如果要解析pdf檔案的頁面資料(檔案上都寫了啥),推薦的工具包為:
- textract,該工具包支援多種格式檔案的資料提取
- pdfminer.six,使用方法同pdfminer是一樣的。pdfminer的使用方法參考這裡
安裝好pdfminer.six後,直接在命令列中呼叫如下命令即可:
pdf2txt.py demo_pdf.pdf -o demo_pdf.txt
或者參考stackoverflow問答可以自定義一個函式批量對pdf進行轉換(文末附有該函式)。
批量提取PDF內容的程式碼
# ref: https://stackoverflow.com/questions/26494211/extracting-text-from-a-pdf-file-using-pdfminer-in-python
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
def convert_pdf_to_txt(path):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = open(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos=set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
text = retstr.getvalue()
fp.close()
device.close()
retstr.close()
return text
textract使用示例
import textract
# 檔案路徑
file_pdf = os.path.join(workdir,'Data/demo_pdf.pdf')
# 提取文字
text = textract.process(file_pdf)
word文件
python-docx
其他統計軟體生成檔案
可以使用的工具包:
pandas.read_sas
,pandas.read_spss
,pandas.read_stata
- pyreadstat,可以讀取SAS,SPSS,Stata等統計軟體匯出的資料檔案。
SPSS生成的.sav檔案
# 使用Python讀取.sav檔案
# https://github.com/Roche/pyreadstat
import pyreadstat
# 檔案路徑
file_data = os.path.join(workdir,'Data/demo_sav.sav')
# 讀取檔案
df,meta = pyreadstat.read_sav(file_data)
# df就是轉化後的資料框
# 檢視編碼格式
print(meta.file_encoding)
pyreadstat包還可以讀取sas,stat的資料檔案
Function in this package | Purpose |
---|---|
read_sas7dat | read SAS sas7bdat files |
read_xport | read SAS Xport (XPT) files |
read_sas7bcat | read SAS catalog files |
read_dta | read STATA dta files |
read_sav | read SPSS sav and zsav files |
read_por | read SPSS por files |
set_catalog_to_sas | enrich sas dataframe with catalog formats |
set_value_labels | replace values by their labels |