Python基礎 | 數據文件的讀寫

[toc]css

本文總結使用Python對常見的數據文件進行讀寫操做。html

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個單元格須要填寫。

2c34fa33c093bd27ea06cd2c33ddff5d.jpeg@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網絡爬蟲開發實戰,崔慶才,也能夠訪問做者的博客

經常使用的工具

網頁數據的爬取和解析常會用到的工具包

爬蟲的步驟

一般網絡爬蟲的步驟以下:

  1. 分析網頁請求規範,好比是get仍是post,請求的url是啥,返回的數據是什麼格式(json?靜態html?),header參數,url或者post中的變量有什麼等;
  2. 獲取網頁數據,使用requests包;
  3. 解析網頁數據(將半結構化的網頁數據轉化爲結構化數據),BeautifulSoup、lxml、re、json齊上陣;
  4. 整合數據並存檔,使用pandas對數據進行整合並初步清洗。

pdf

參考資料:

對於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文件的頁面數據(文件上都寫了啥),推薦的工具包爲:

安裝好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

原文出處:https://www.cnblogs.com/dataxon/p/12556727.html

相關文章
相關標籤/搜索