[toc]css
本文總結使用Python對常見的數據文件進行讀寫操做。html
- 本文所用的示例數據下載,提取碼: sjgz
- pandas官網的數據I/O部分是很好的學習材料
txt
關於通常文件讀寫的更多參考python
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
來讀取。git
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日誌。github
# 程序執行的日誌 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即逗號分隔的文件,可使用的包json
pandas
在數據分析中最經常使用,功能也很強大,這裏只示範pandas的用法api
# 定義文件路徑 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.app
# 定義文件路徑 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示範自動化「填表」,好比如今有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網絡爬蟲開發實戰,崔慶才,也能夠訪問做者的博客
經常使用的工具
網頁數據的爬取和解析常會用到的工具包
-
lxml, 解析網頁中的css目錄很好用
-
[json](https://docs.python.org/3/library/json.html, 處理json格式數據),json和html是常見的半結構化數據
-
pandas,主要是對結構化的數據(dataframe)進行處理
爬蟲的步驟
一般網絡爬蟲的步驟以下:
- 分析網頁請求規範,好比是get仍是post,請求的url是啥,返回的數據是什麼格式(json?靜態html?),header參數,url或者post中的變量有什麼等;
- 獲取網頁數據,使用requests包;
- 解析網頁數據(將半結構化的網頁數據轉化爲結構化數據),BeautifulSoup、lxml、re、json齊上陣;
- 整合數據並存檔,使用pandas對數據進行整合並初步清洗。
參考資料:
對於pdf文件而言,若是要對文檔操做(好比合並、篩選、刪除頁面等),建議使用的工具包:
處理pdf文件時,要注意文件須要是「無密碼」狀態,「加密」狀態的文件處理時會報錯。 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文檔
其餘統計軟件生成文件
可使用的工具包:
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 |
原文出處:https://www.cnblogs.com/dataxon/p/12556727.html