[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