Python在文件解析方面有很多丰富的三方模块,接下来我们就看如何使用Python解析以下几种常见格式的文件。
1. Excel文件解析
标准的Excel文件其实就相当于一张表,有表头和对应的数据。一般常见的Excel文件都以.xls、.xlsx和.et结尾。
以下是使用xlrd模块实现解析Excel文件的代码:
import json
import xlrd
def xls_parse(file_data):
# 打开一个电子表格文件进行数据提取
data = xlrd.open_workbook(file_contents=a bytes object, encoding_override='utf-8')
# 一个Excel文件中所有sheet的名称
sheets = data.sheet_names()
# 通过sheet名获取对应的sheet表内容
table = data.sheet_by_name(sheets[0])
start_row = 0 # 起始行
rows = table.nrows # 表格总行数
# 假如第一行是表头
header = table.row_values(0)
# 遍历表记录
for i in range(1, rows):
# 表记录值与对应的表头组成字典
col_dic = dict(zip(header, table.row_values(i)))
raw_item = json.dumps(col_dic, ensure_ascii=False)
yield raw_item # 返回json格式
2. PDF文件解析
PDF相对来说是比较难的解析,除非PDF中有类似Excel格式的数据,否则解析出来的数据很难进行规范化。Python中也有很多解析pdf文件的第三方库。比如tabula等
tabula的解析代码:
import json
import tabula
import pandas as pd
def pdf_parse(file_data):
# 提取PDF文件中的表格
tables = tabula.read_pdf(file_data, pages="all") # file_data为BytesIO对象
# 遍历提取出的所有表格
for df in tables:
# 提取表头
columns = list(df.columns)
# 按列切分表格记录
df_new = pd.DataFrame(columns=columns)
for col in columns:
pass
# DataFrame转JSON
json_array = json.loads(df_new.to_json(orient="records", force_ascii=False))
for item in json_array:
yield json.dumps(item, ensure_ascii=False)
除了tabula之外,本人还是测试了很多其他的第三方模块,比如pdfminer.six、pdfminer3k、pdfplumber、PyPDF2、slate3k、camelot。要使用哪个模块,主要依赖于pdf文件内容的规范程度,总的来说推荐使用pdfplumber或者tabula。
3. HTML文件解析
HTML格式的文件相当于是半结构的数据,解析相对来说比较简单。
html文件的解析代码:
import json
from lxml.etree import HTML
def html_parse(file_data):
# 从一个字符串常量中解析HTML文档
html = HTML(file_data.read())
html_tables = html.findall("body/table")
# 将HTML中的所有<table>都放到一个列表中, 以便后续统一处理
table_rows = []
for html_table in html_tables:
table_rows.extend(list(html_table))
rows = len(table_rows) # 表格总行数
start_row = 0 # 起始行
# 假设第一行是表头
header = [col.text for col in table_rows[0]]
# 遍历表记录
for i in range(start_row, rows):
values = [col.text for col in table_rows[i]]
# 表记录值与对应的列名组成字典
col_dic = dict(zip(header, values))
# 字典转json
raw_item = json.dumps(col_dic, ensure_ascii=False)
yield raw_item
4. CSV文件解析
csv是默认以逗号(,)分割的一行行数据组成的文件。通常情况,csv文件都可以通过Excel软件打开,正常显示为表格。
csv文件解析代码:
def csv_parse(file_data):
file_bytes_obj = file_data.read() # file_data为BytesIO对象
# 根据文件内容检测编码格式有时候会不准确, 这时可以尝试更范围的编码格式
# 范围: gb18030 > gb2312 > gbk
encode = chardet.detect(file_bytes_obj)["encoding"]
file_string_io = StringIO(file_bytes_obj.decode(encode).replace('\r', '\r\n'))
csv_data = list(csv.reader(file_string_io))
start_row = -1 # 起始行
rows = len(csv_data) # 表格总行数
# 表头
header = csv_data[i]
# 遍历表记录
for i in range(start_row, rows):
col_dic = dict(zip(header, csv_data[i]))
# 字典转json
raw_item = json.dumps(col_dic, ensure_ascii=False)
yield raw_item
如有遇到其他格式的文件,之后会持续更新到这篇文章中!