Python数据预处理——格式转换及抽取数据文本信息

课程地址:https://www.imooc.com/learn/1105

1. 数据预处理简介

1.1 什么是数据预处理

数据预处理简单来说就是:将原始数据装进一个预处理的黑匣子之后,产生出高质量数据,用来适应相关技术或算法模型。

  • 将原始数据直接进行分类模型训练,由于原始数据存在许多干扰项,分类器准确率和召回率都比较低

  • 将原始数据放进预处理黑匣子后,会自动过滤掉干扰数据,并且会按照规约的方法体现每个词特征的重要性,然后将词特征压缩变换在数值型矩阵中,再通过分类器就会取得不错的效果,可以进行工程应用。

    预处理前: 不完整、偏态、噪声、特征比重、特征维度、缺失值、错误值等问题;
    预处理后: 存在完整、正态、干净、特征合适、特征维度合理、无缺失值等优点

1.2 预处理流程

  • 数据清理
    通过填写缺失值光滑噪声数据识别或删除离群点并解决不一致性来清理数据。
    目标:格式标准化、异常数据清理、错误纠正、重复数据的清除。
  • 数据集成
    将数据由多个数据源合并成一个一致的数据存储,如数据仓库。
  • 数据变换
    通过平滑聚集、数据概化、规范化等方式将数据转换成适用于的形式。如把数据压缩到0.0-1.0数值区间。
  • 数据归约
    往往数据量非常大,得到数据集的规约表示,它小得多,但仍接近保持原数据的完整性,结果与规约前结果相同或几乎相同。

2. Python数据预处理之抽取文本信息

2.1 常见数据类型与数据采集

2.1.1 结构化数据

  • 数据特点:关系模型数据,关系数据库表示。
  • 例子:如MySQL、Oracle、SQL Server等。
  • 应用场景:数据库、系统网站、数据备份、ERP等。
  • 数据采集:DB导出、SQL等方式。

2.1.2 半结构化数据

  • 数据特点:非关系模型数据,有一定的格式。
  • 常见格式:如Email、HTML、XML、JSON等。
  • 应用场合:邮件系统、档案系统、新闻网站等。
  • 数据采集:网络爬虫、数据解析等方式。

2.1.3 非结构化数据

  • 数据特点:没有固定格式的数据。
  • 常见格式:Word、PDF、PPT、图片、音视频等。
  • 应用场合:图片识别、人脸识别、医疗影像、文本分析等。
  • 数据采集:网络爬虫、数据存档等方式。

2.2 文本抽取问题

  • 格式转换后,识别乱码较多
  • 不支持或限制支持批量处理
  • 格式转换后的txt文件存在编码问题
  • 生成目标文件标题跟原标题不一致
  • 操作不够灵活便捷

功能设计:

  • 支持PDF/Word等转TXT
  • 自动过滤不符合指定格式的文件
  • 生成的目标文件与原文件目录一致
  • 生成文档采用统一的编码格式保存(如:UTF-8)
  • 支持默认保存路径和自定义保存路径

2.3 Word转TXT算法实现

算法思路:

  • 定义文件路径和转存路径:split
  • 修改新的文件名:fnmatch
  • 设置完整的保存路径:join
  • 启动应用程序格式转换:Dispatch
  • 保存文本:SaveAs
# coding=utf-8
# Word文档信息提取
import fnmatch
import os
from win32com import client as wc
from win32com.client import Dispatch

"""
功能描述:word文件转存txt,默认保存在根目录下,支持自定义
参数描述:1.filePath:文件路径;2.savePath:保存路径
"""
def wordtotxt(filePath, savePath=''):
    # 1.切分文件路径为文件目录和文件名
    dirs, filename = os.path.split(filePath)
    # print(dirs, '\n', filename)
    # 2.修改切分后的文件后缀
    new_name = ""
    if fnmatch.fnmatch(filename, '*.doc'):
        new_name = filename[:-4]+'.txt'
    elif fnmatch.fnmatch(filename, '*.docx'):
        new_name = filename[:-5]+'.txt'
    else:
        print('格式不正确,仅支持doc/docx格式!')
        return

    # 3.设置新的文件保存路径
    if savePath=='':
        savePath = dirs
    else:
        savePath = savePath
    word2txtPath = os.path.join(savePath, new_name)
    print('--->', word2txtPath)

    # 4.加载文件提取的处理程序 word-->txt
    wordapp = wc.Dispatch('Word.Application')
    mytxt = wordapp.Documents.Open(filePath)

    # 5.保存文本信息
    mytxt.SaveAs(word2txtPath, 4)   # 参数4代表抽取文本
    mytxt.Close()


if __name__ ==  '__main__':
    # 获取绝对路径
    filePath = os.path.abspath(r'test.docx')
    filePath2 = os.path.abspath(r'PCB线路板的组成及部分主要功能.doc')
    wordtotxt(filePath)
    wordtotxt(filePath2)

test.docx:
在这里插入图片描述
PCB线路板的组成及部分主要功能.doc:
在这里插入图片描述
效果:
在这里插入图片描述
在这里插入图片描述

2.4 PDF转TXT算法实现

算法思路:

  • 定义文件路径和转存路径:split
  • 修改新的文件名:fnmatch
  • 设置完整的保存路径:join
  • 启动应用程序格式转换:Dispatch
  • 保存文本:SaveAs
# coding=utf-8
# PDF文档信息提取

import os, fnmatch
from win32com import client as wc
from win32com.client import Dispatch


"""
功能描述:pdf文件转存txt,默认保存在根目录下,支持自定义
参数描述:1.filePath:文件路径;2.savePath:保存路径
"""
def pdftotxt(filePath, savePath = ""):
    # 1.切分文件路径为文件目录和文件名
    dirs, filename = os.path.split(filePath)
    # print(dirs, '\n', filename)
    # 2.修改切分后的文件后缀
    new_name = ""
    if fnmatch.fnmatch(filename, '*.pdf') or fnmatch.fnmatch(filename, '*.PDF'):
        # 截取至倒数第4位
        new_name = filename[:-4] + '.txt'
    else:
        print('格式不正确,仅支持pdf格式!')
        return

    # 3.设置新的文件保存路径
    if savePath == '':
        savePath = dirs
    else:
        savePath = savePath
    pdf2txtPath = os.path.join(savePath, new_name)
    print('--->', pdf2txtPath)

    # 4.加载文件提取的处理程序 word-->txt
    wordapp = wc.Dispatch('Word.Application')
    mytxt = wordapp.Documents.Open(filePath)

    # 5.保存文本信息
    mytxt.SaveAs(pdf2txtPath, 4)  # 参数4代表抽取文本
    mytxt.Close()


if __name__ == '__main__':
    # 获取绝对路径
    filePath = os.path.abspath(r'test.docx')
    filePath2 = os.path.abspath(r'PCB线路板的组成及部分主要功能.doc')
    filePath3 = os.path.abspath(r'test.pdf')
    pdftotxt(filePath)
    pdftotxt(filePath2)
    pdftotxt(filePath3)

执行效果:

格式不正确,仅支持pdf格式!
格式不正确,仅支持pdf格式!
---> E:\pythonProject\DataProcess\test.txt

2.5 文本抽取工具与编码

算法思路:

  • 定义文件夹路径和转存路径:split
  • 修改新的文件名:TranType(filename, typename)、fnmatch
  • 设置完整的保存路径:join
  • 启动应用程序格式转换:Dispatch
  • 保存文本:SaveAs
# coiding=utf8

"""
多格式文档文本抽取工具
"""

import os, fnmatch
from win32com import client as wc
from win32com.client import Dispatch

"""
功能描述:抽取多文档文本,默认保存在根目录下,支持自定义
参数描述:1.filePath:文件路径;2.savePath:保存路径
"""
def filetotxt(filePath, savePath=""):
    # 1.切分文件路径为文件目录和文件名
    dirs, filename = os.path.split(filePath)
    # print(dirs, '\n', filename)
    # 2.修改切分后的文件后缀
    typename = os.path.splitext(filename)[-1].lower() # 获得文件后缀
    new_name = tranType(filename, typename)
    # 3.设置新的文件保存路径
    if savePath == '':
        savePath = dirs
    else:
        savePath = savePath
    new2txtPath = os.path.join(savePath, new_name)
    print('--->', new2txtPath)

    # 4.加载文件提取的处理程序 word-->txt
    wordapp = wc.Dispatch('Word.Application')
    mytxt = wordapp.Documents.Open(filePath)

    # 5.保存文本信息
    mytxt.SaveAs(new2txtPath, 4)  # 参数4代表抽取文本
    mytxt.Close()


"""
功能描述:根据文件后缀修改文件名
参数描述:1.filename:文件路径;2.typename:文件后缀
返回参数:new_name 返回修改后新的文件名
"""
def tranType(filename, typename):
    new_name = ''
    if typename == '.pdf': # pdf-->txt
        if fnmatch.fnmatch(filename, '*.pdf'):
            new_name = filename[:-4] + '.txt'
        else: return
    elif typename == ".doc" or typename == ".docx": # word-->txt
        if fnmatch.fnmatch(filename, '*.doc'):
            new_name = filename[:-4] + '.txt'
        elif fnmatch.fnmatch(filename, '*.docx'):
            new_name = filename[:-5] + '.txt'
        else: return
    else:
        print('警告:\n 您输入【',typename,'】不合法,本抽取工具仅支持doc/docx/pdf格式文件,请输入正确格式')
        return
    return new_name

if __name__ == '__main__':
    # 获取绝对路径
    filePath = os.path.abspath(r'test2.docx')
    filePath2 = os.path.abspath(r'PCB线路板的组成及部分主要功能.doc')
    filePath3 = os.path.abspath(r'test.pdf')
    filetotxt(filePath)
    filetotxt(filePath2)
    filetotxt(filePath3)
---> E:\pythonProject\DataProcess\test2.txt
---> E:\pythonProject\DataProcess\PCB线路板的组成及部分主要功能.txt
---> E:\pythonProject\DataProcess\test.txt

2.6 Excel转TXT

# encoding: utf-8
import xlwt
import xlrd

"""
txt文件转换为excel文件(.xls/.xlsx)
filename:txt文本文件名称
xlsname:转换后的excel文件名
"""
def txt_xls(filename, xlsname):
    try:
        # 打开txt文本进行读取
        f = open(filename)
        xls = xlwt.Workbook()
        # 生成excel的方法,声明excel
        sheet = xls.add_sheet('Sheet1', cell_overwrite_ok=True)
        x = 0 # excel开始写的位置
        # 循环,读取文本中的所有内容
        while True:
            # 按行循环,读取文本文件
            line = f.readline()
            if not line:
                break  # 如果没有内容,则退出循环
            for i in range(len(line.split(','))):
                item = line.split(',')[i]
                sheet.write(x, i, item) # x表示行,i表示列
            x += 1 # excel另起一行
        f.close()
        xls.save(xlsname) # 保存xls文件
    except:
        raise

"""
返回一行数据
row_data:行数据
"""
def row2str(row_data):
    try:
        values = ""
        for i in range(len(row_data)):
            if i == len(row_data) - 1:
                values = values + str(row_data[i])
            else:
                # 使用英文逗号作为分隔符
                values = values + str(row_data[i]) + ","
        return values
    except:
        raise


"""
excel文件转换为txt文件
xls_name:excel文件名称
txt_name:txt文件名称
"""
def xls_txt(xls_name, txt_name):
    try:
        # 创建工作簿对象
        wb = xlrd.open_workbook(xls_name)
        # 文件读写方式为追加
        file = open(txt_name, "a")
        sheet = wb.sheets()[0] # 获取第一个工作表
        # 获取工作表的行数
        rows = sheet.nrows
        # 获取工作表的列数
        col_cnt = sheet.ncols
        # 跳过第一行
        for i in range(1, rows):
            row_data = sheet.row_values(i)
            # 将行数据转成字符串
            row_values = row2str(row_data)
            # 将字符串写入新文件,每行结束则换行
            file.writelines(row_values + "\r")
        # 关闭写入的文件
        file.close()
    except:
        pass


if __name__ == '__main__':
    xls_name = 'LOL英雄.xls'
    txt_name = 'test.txt'
    xls_txt(xls_name, txt_name)
    filename = "test.txt"
    xlsname  = "test.xls"
    txt_xls(filename, xlsname)

LOL英雄.xls:
在这里插入图片描述
执行效果:
在这里插入图片描述
在这里插入图片描述

2.7 遍历读取文件

算法思路:

  • 遍历文件的类TraversalFun:TraversalDir、AllFiles
  • 遍历目录文件TraversalDir:AllFiles(self.rootDir)
  • 递归遍历文件AllFiles:AllFiles(self, rootDir)
  • 判断是否为文件isfile:打印出文件名
  • 判断是否是目录isdir:递归遍历
# coding=utf8

"""
遍历目录文件,打印出所有文件的完整路径
"""

# 遍历目录处理子文件
import os, time


class TraversalFun():
    # 1.初始化,rootDir目录文件路径
    def __init__(self, rootDir):
        self.rootDir = rootDir

    # 2.遍历目录文件
    def TraversalDir(self):
        TraversalFun.AllFiles(self, self.rootDir)

    # 3.递归算法遍历所有文件,并打印文件名(非目录文件)
    def AllFiles(self, rootDir):
        # 获取根目录下所有文件
        for lists in os.listdir(rootDir):
            path = os.path.join(rootDir, lists)
            print(path)


if __name__ == '__main__':
    time_start = time.time()
    rootDir = r"."
    tra = TraversalFun(rootDir)
    tra.TraversalDir()
    time_end = time.time()
    print('totally cost', (time_end - time_start), 's')

执行结果:

.\.idea
.\ConvFormat.py
.\ExtractTxt.py
.\new_
.\PCB线路板的组成及部分主要功能.doc
.\PCB线路板的组成及部分主要功能.txt
.\pdf2txt.py
.\test.pdf
.\test.py
.\test.txt
.\test2.docx
.\test2.xls
.\TraverFiles.py
.\word2txt.py
.\__pycache__
.\~$test2.docx
totally cost 0.0 s

2.8 实战案例:遍历文本,批量抽取文本内容

算法思路:

  • 引用外部文本抽取模块:import ExtractTxt as ET
  • 参数方法使用:TraversalFUn(rootDir, ET.Files2Txt, saveDir)
  • 创建保存根目录:os.path.abspath
  • 递归遍历文件:func(path, save_dir)
# coding=utf8

"""
批量抽取新闻文本信息(3类90条)
"""

import os, time
from _ctypes_test import func

import ExtractTxt as ET

"""
功能描述:遍历目录处理子文件,抽取其文本
参数描述:1.rootDir:根目录,2.func:方法参数,3.saveDir:保存路径
"""
class TraversalFun():
    # 1.初始化,rootDir目录文件路径
    def __init__(self, rootDir, func=None, saveDir=''):
        self.rootDir = rootDir # 目录文件夹路径
        self.func = func       # 方法参数,实现文本提取
        self.saveDir = saveDir # 文件夹保存路径

    # 2.遍历目录文件
    def TraversalDir(self):
        # 切分文件目录和文件名
        dirs, filename = os.path.split(self.rootDir)
        # 保存目录
        save_dir = ""
        if self.saveDir == "":
            save_dir = os.path.abspath(os.path.join(dirs, "new_"+filename))
        else:
            save_dir = self.saveDir

        # 创建保存路径
        if not os.path.exists(save_dir):
            # 不存在则创建
            os.makedirs(save_dir)
        print("保存目录:\n", save_dir)

        # 遍历文件,抽取txt文本内容
        TraversalFun.AllFiles(self, self.rootDir, save_dir)

    # 3.递归算法遍历所有文件,并打印文件名(非目录文件)
    def AllFiles(self, rootDir, save_dir=''):
        # 获取根目录下所有文件
        for lists in os.listdir(rootDir):
            path = os.path.join(rootDir, lists)
            # 核心算法,对文件类型信息抽取并保存
            if os.path.isfile(path):
                self.func(os.path.abspath(path), os.path.abspath(save_dir))
            # 递归遍历目录
            if os.path.isdir(path):
                newsave_dir = os.path.join(save_dir, lists)
                if not os.path.exists(newsave_dir):
                    # 不存在则创建
                    os.mkdir(newsave_dir)
                TraversalFun.AllFiles(self, path, newsave_dir)

# 主函数设置
if __name__ == '__main__':
    time_start = time.time()
    saveDir = r'E:' # 自定义保存路径
    rootDir = r"."
    tra = TraversalFun(rootDir, ET.filetotxt, saveDir)
    tra.TraversalDir()
    time_end = time.time()
    print('totally cost', (time_end - time_start)*1000, 'ms')

参考文章:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里逆天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值