1. 概要

在办公处理中,我们常常要打开一些文件,面临大量的数据时,传统的人工方法耗时耗力。在python中,有一系列包装好的库,让我们能够很方便的操作各种类型的文件。当然,python的内置函数也能够很好的打开一些文件。本文主要探讨python打开各类文件的方式。本文介绍的主题内容如下所示:

2. 操作txt文本文件

2.1 打开模式

file = open(path,'r')

我们可以用多种不同的方式去打开txt文件,具体类型如下:

类型读写操作备注
r只读/
w只写覆盖
a只写追加
r+可读可写覆盖
w+可读可写覆盖
a+可读可写追加

不同的打开模式获得不同的权限。另外,使用w、a以及w+、a+模式打开不存在的文件时,系统会创建一个文件,而使用 r 和 r+ 则会报错。

2.2 读取方式

一般情况下,如果只是要读取文件内的内容,那么我们可以不输入打开模式参数,默认为”r”。

(1)read()

read() 一次性读全部内容 一次性读取文本中全部的内容,以字符串的形式返回结果。

f = open('example.txt',encoding = 'utf-8')content = f.read()print(content)f.close()

打印出来的结果如下所示:

当你老了头发花白

你会发现输出出来的文本样式,和在记事本里看到的基本一致。注意,两行之间存在换行符。

(2)readline()

readline() 读取第一行内容,只读取文本第一行的内容,以字符串的形式返回结果。这个函数一般用于循环读取,将每一行的内容作为元素装入列表。

f=open('example.txt', encoding='utf-8')line = f.readline().strip()    #读取第一行txt=[]txt.append(line)while line:  # 直到读取完文件   line = f.readline().strip()  # 读取一行文件,包括换行符   txt.append(line)f.close()  # 关闭文件print(txt)

输出的结果如下所示:

['当你老了', '头发花白', '']

这里每个字符串末尾之所以没有出现换行符,是因为使用**strip()**函数进行了处理。另外我们也可以像下面这样,处理文本文件的每一行,其本质是和上面一样的。

txt = []for line in f:......

(3)readlines()

readlines()读取文本所有内容,并且以数列的格式返回结果。这里返回的结果其实是和上面使用 readline() 逐行读取的结果是一样的,不再过多展示。

f=open('example.txt',encoding='utf-8')data = f.readlines()  f.close() print(data) #返回list

2.3 写入文件

在文件中写入内容,需要打开文件,主要用到 write() 函数。注意 wirte() 写入后默认不换行。

f = open('example.txt','a+',encoding = 'utf-8')     # 选择了可读可写的追加模式f.write('\n睡意沉沉')f.close()f=open('example.txt',encoding='utf-8')print(f.read())f.close()  

打印出的结果如下所示:

当你老了头发花白睡意沉沉

注意,这里我们在写入后先关闭了文件,而后再重新打开文件读取。因为 readline() 和readlines() 以及 read() 函数都是根据指针进行读取的,如果直接在写完以后进行读取,那么读到的一定是空白。

3. 读取excel文件数据

打开excel的方式有很多,本文主要介绍一种方法,使用pandas将excel数据转化为dataframe结构。

import pandas as pddf = pd.read_excel('example.xlsx',sheet_name = 'Sheet1',converters={'id':str})df.head()

通过“sheet_name”指定对应得工作表。另外,在excel中,有一些编码信息,如学号或者id,可能以0开头,在默认情况下python会将其理解为整数!并将其前面的0给截断。所以使用后面得 converters 参数进行以后类型转换。

现在,python有很多开发好的优秀的处理excel的包,如openpyxl、xlwt,但如果仅仅是为了读取数据,其实使用pandas就已经非常足够了。但如果是要对 excel 文件进行编辑操作的话,我更加推荐的是使用 openpyxl 库,这里不再过多介绍。

pandas中得dataframe是一个很强大的数据结构,能够很快的索引到想要的信息。在本例中,示例文件中的数据如下所示:

idageweight
0011460
0021565
0031662
0041764
0051865

获取某一列的数据,这里其实返回的是一个series结构。

id_s = df['id']

获取某一行的数据,并获取该行的单独某一项。

temp = df.iloc[0]print(temp,end = '\n\n')print(temp.id,temp.age,temp.weight)

该代码的运行结果如下所示:

id         001age         14weight    60.0Name: 0, dtype: object001 14 60.0

4. 读取PDF–PyMuPdf

PDF(Portable Document Format)是一种便携文档格式,便于跨操作系统传播文档。PDF文档遵循标准格式,因此存在很多可以操作PDF文档的工具,Python自然也不例外。本文主要介绍一种好用的的 python-pdf 包——PyMuPdf。

PyMuPDF是MuPDF的Python绑定——一个轻量级的PDF,XPS和电子书查看器,渲染器和工具包,由Artifex软件公司维护和开发。

打开一个文件。

doc = fitz.open(filename)

常见方法和属性:

Method / AttributeDescription
Document.page_countthe number of pages (int)
Document.metadatathe metadata (dict)
Document.get_toc()get the table of contents (list)
Document.load_page()read a page

如何读取pdf文件内的全部文本:

import fitz# 定义一个函数,根据文件路径读取pdf文件,并返回pdf文本的字符串def read_pdf(path):    doc = fitz.open(path)    txt = ''    for page in doc.pages():        temp = page.get_text()        txt += temp    return txt

为什么选择PyMuPDF?对比其它的开源包,它最大的特点就是运行速度较快,毕竟谁也不想花很长时间等待运行结果。除了简单的读取文本,该库还支持读取图片、读取表格、高亮标记等一系列功能,更多详情请见官方文档。

5. Word的读取与写入

这里主要介绍python-docx。先简单了解一下Word文档。和纯文本(比如txt)相比, .docx文件有很多种结构,这些结构在python-docx中用3种不同的类型来表示:最高一层是Document对象表示文档,每个Document对象包含一个Paragraph 对象也就是段落组成的列表,而每个Paragraph对象则包含一个Run对象的列表。

也可以用它来处理表格,基本结构如下:

  • python-docx将文章中所有的表格都存放在document.tables
  • 每个Table都有对应的行table. rows、列table. columns和单元格(table. cell())
  • 单元格是最基本的单位,每个单元格又被划分成不同的Paragraph对象

具体的结构图如下所示:

5.1 读取文档

下面我们通过python-docx来读取word文档,并查看相关属性。

import docx# 读取Word文档doc = docx.Document(r'python.docx')print( len(doc.paragraphs))    # 查看段落数量print(doc.paragraphs[0].text)    # 查看第一段的内容# print(doc.paragraphs[0].runs)    # 查看第一段的run对象print(len(doc.paragraphs[0].runs))   # 查看第一段中run对象的个数for i in range(10):    print(doc.paragraphs[0].runs[i].text,end = ' ')

如果要读取word的完整文本内容,我们自定义一个函数,使用换行符来分隔开每一段。

def getText(fileName):    doc = docx.Document(fileName)    TextList = []    for paragraph in doc.paragraphs:        TextList.append(paragraph.text)        return '\n'.join(TextList)

5.2 写入文档

对于Run对象的字符text属性,都有3个状态:True(启用)、False(禁用)和None(默认)。text的常见属性如下:

属性描述
bold文本以粗体出现
italic文本以斜体出现
underline文本带下划线
strike文本带删除线
double_strike文本带双删除线

接下来我们看看如何创建并写入Word,要创建自己的.docx 文件,就调用 docx.Document(),返回一个新的、空白的 Word Document 对象 。Document 对象的 add_paragraph()方法将一段新文本添加到文档中,并返回添加的 Paragraph 对象的引用。

import docxdoc = docx.Document()doc.add_paragraph('这是一个段落')doc.add_run('加粗的一句话').bold = Truedoc.add_paragraph('这是第二个段落')doc.save('多段落.docx')

常用的添加方法:

方法作用
add_paragraph()添加段落
add_run()在当前段落尾加上词 / 句
add_break()添加换行符(仍然当前段落)
add_picture在段落末尾添加图像

6. 参考资料

【1】python读取txt文件(多种方法)总裁余(余登武)的博客

【2】python读取、写入txt文本内容

【3】使用Python操作PDF:常用PDF库总结

【4】Recipes: Text — PyMuPDF 1.20.2 documentation

【5】用Python读写Word文档入门 – 腾讯云开发者社区-腾讯云 (tencent.com)

【6】python docx 使用总结 – 简书 (jianshu.com)