Python——Excel、PDF、HTML、CSV文件解析

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

如有遇到其他格式的文件,之后会持续更新到这篇文章中!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值