• Python基础 | 数据文件的读写


    本文总结使用Python对常见的数据文件进行读写操作。

    txt

    关于一般文件读写的更多参考

    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来读取。

    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日志。

    # 程序执行的日志
    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 
    '%i
        f_log.write(line)
    
    f_log.close()
    

    csv

    csv即逗号分隔的文件,可以使用的包

    pandas在数据分析中最常用,功能也很强大,这里只示范pandas的用法

    # 定义文件路径
    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)
    

    xlsxlsx

    pandas工具包中也提供了相应的函数来读写excel文件(pandas.read_excel()dataframe.to_excel())。
    更多参考
    不同于csv文件,xlsx文件中会有多个sheet,pandas.read_excel函数默认读取第一个sheet.

    # 定义文件路径
    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

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。

    转载请注明作者及出处

  • 相关阅读:
    Dialog 不能全屏,左右有间距解决方案
    mac apktool配置
    HTML5网站如何做到完全不需要jQuery
    js中控制小数点的显示位数的技术整理
    ASP.NET后台获取cookie中文乱码解决办法
    javascript删除元素节点
    js获取不到动态添加的标签的值的解决方法
    JS常用方法函数整理
    JS获取当前页面的URL信息
    轻轻松松 用U盘安装WIN7
  • 原文地址:https://www.cnblogs.com/dataxon/p/12556727.html
Copyright © 2020-2023  润新知