目录
一、文件概述
二、文本文件操作
2.1 文件打开
2.2文件的关闭
2.3文件的读、写操作
1) 读取方法
2)写入方法
2.4读写指针的重定位
2.5其它文本文件
三、Excel文件处理
3.1xlrd、xlwt、xlutils.copy
3.1.1 参考资料
3.1.2xlrd模块 - 读操作
3.1.3xlwt模块 -写操作
3.2pandas
3.3xlwings、pandas
四、一二维数据的格式化和处理
五、word文档处理
六、应用实例
一、文件概述
--什么是文件?
文件:指存储在外存介质(如磁盘、光盘、U盘等)上的数据集合文件名:通常由路径、主文件名、扩展名三部分组成 例如:D:\Python\test6-1.txt
import ospath = r'D:\Python\test6-1.txt'print(os.path.dirname(path)) # 路径print(os.path.basename(path)) # 主文件名.扩展名print(os.path.split(path)) # 把路径分割成 dirname 和 basename,返回一个元组print(os.path.splitext(path)) # 分割路径中的文件名(包含路径)与拓展名print(os.path.splitext(os.path.basename(path))) # 分割路径中的文件名(不含路径)与拓展名# 分别获取文件名(不含路径)与拓展名
--文件分类
根据文件的存储形式,可分为文本文件(即ASCII码)和二进制文件: 文本文件:每一个字节存储1个字符,但一般占用存储空间较多 可以使用文本编辑软件查看,如:txt文件、sql文件本质上还是二进制文件二进制文件:把内存中的数据,原样输出到磁盘文件中。 文件的内容不能直接阅读,而是提供给其它软件使用的二进制文件不能使用文本编辑软件查看,需要使用特定的编辑器才能打开如图片、视频文件等二进制文件直接由0和1组成,没有统一字符编码,文件内部数据的组织格式与文件用途有关。二进制文件和文本文件最主要的区别在于是否有统一的字符编码通常,文本文件可以用“文本文件方式” 或“二进制文件方式”打开,打开后的操作不同;二进制文件只能用“二进制文件方式” 打开
txt_file = open('6-1.txt', 'rt') # rt 表示文本文件方式print(txt_file.readline())txt_file.close()bin_file = open('6-1.txt', 'rb') # rb 表示二进制文件方式print(bin_file.readline())bin_file.close()
运行结果:
二、文本文件操作
Python对文本文件和二进制文件采用统一的操作步骤: 打开 -- 读写 -- 关闭
2.1 文件打开
file_name :文件名,必填项access_mode :访问模式buffering 缓存:0 无缓存,1 缓存1行,大于1 缓存大小(字节)返回值:文件对象,可对文件进行各种操作access_mode说明,打开文件的模式。默认值是’r’,表示使用文本的方式打开文件来读取
file对象
属性 closedmodename方法 read( )write( )close( )
>>> f = open('E:\python\培训课件\p6-常用文件处理\code\myfile.txt','w+')>>> f.write('Hello,Python!')13>>> f.read()''>>> f.seek(0) # 从文件头开始,不偏移字符0>>> f.read()'Hello,Python!'>>> f.name'E:\\python\\培训课件\\p6-常用文件处理\\code\\myfile.txt'>>> f.mode'w+'>>> f.closedFalse>>> f.close()>>> f.closedTrue
seek()方法
作用:设置读写位置
f.seek(偏移量, whence=相对位置)
偏移量
大于0的数代表向文件末尾方向移动的字节数
小于0的数代表向文件头方向中移动的字节数
相对位置
0 代表从文件头开始偏移
1 代表从文件当前读写位置开始偏移
2 代表从文件尾开始偏移
seek(n,0):从起始位置开始移动n个字符seek(n,1):从当前位置往后移动n个字符seek(n,2):从文件结尾往前移动n个字符
f = open("myfile.txt", "r")f.seek(5,1) # 从文件头开始,偏移5个字符data = f.read(5) # 读取5个字符print(data) # 因此打印出来的就是5~9个字符f.close()# 关闭文件
2.2文件的关闭
当对文件内容操作完以后,一定要关闭文件对象,这样才能保证所做的修改都被保存到文件中;请注意:即使写了关闭文件的代码,也无法保证文件一定能够正常关闭。例如,如果在打开文件之后和关闭文件之前发生了错误导致程序崩溃,这时文件就无法正常关闭。在管理文件对象时推荐with关键字,可以有效地避免这个问题:格式: with open(filename, mode, encoding) as fp:
s = 'Hello world\n文本文件的读取方法\n文本文件的写入方法\n'with open('sample.txt', 'w') as fp:fp.write(s)
encoding:编码,默认为UTF-8
处理文本文件时,由于编码问题报错的几率比较大
常见的编码有:GB2312、GBK、UTF-8
2.3文件的读、写操作
1) 读取方法
read([size=-1]):从文本文件中读取size个字符的内容作为结果返回,或从二进制文件中读取指定数量的字节并返回,如果省略size则表示读取所有内容# abcdef# ABCDEF# 123456# Python程序设计基础>>> f = open(r'E:\python\培训课件\p6-常用文件处理\code\test6-2.txt', 'r')>>> f.read(1)'a'>>> f.read(1)'b'>>> f.read(10)'cdef\nABCDE'>>> f.read(10)'F\n123456\nP'>>> while True:...a = f.read()...if a:... print(a, end='')...else:... break...ython程序设计基础>>> f.seek(0)0>>> f.read() # 读取所有字符,不指定大小'abcdef\nABCDEF\n123456\nPython程序设计基础'>>> f.close()
readline():从文本文件中读取一行内容作为结果返回readlines():把文本文件中的每行文本作为一个字符串存入列表中,返回该列表,对于大文件会占用较多内存,不建议使用
>>> f = open(r'E:\python\培训课件\p6-常用文件处理\code\test6-2.txt', 'r')>>> f.seek(0)0>>> f.readlines()['abcdef\n', 'ABCDEF\n', '123456\n', 'Python程序设计基础']>>> f.seek(0)0>>> f.readlines()['abcdef\n', 'ABCDEF\n', '123456\n', 'Python程序设计基础']>>> f.seek(0)0>>> for r in f.readlines():...print(r) # 文本逐行打印...abcdefABCDEF123456Python程序设计基础>>> f.seek(0)0>>> f.readline()'abcdef\n'>>> f.readline()'ABCDEF\n'>>> f.close()
文本文件逐行打印,即遍历文件的所有行可以直接这样写(把文件对象看作集合):
f = open(r'test6-2.txt', 'r')for line in f:print(line)f.close()
2)写入方法
write(s):把字符串s的内容写入文件writelines(s):把字符串列表s写入文本文件,不添加换行符>>> f = open(r'E:\python\培训课件\p6-常用文件处理\code\test6-3.txt', 'w')>>> f.write('str1')4>>> f.write('str2')4>>> f.write('python')6>>> alist = ['abcdef\n', 'ABCDEF\n', '123456\n', 'Python程序设计基础']>>> f.writelines(alist)>>> f.close()>>> f = open(r'E:\python\培训课件\p6-常用文件处理\code\test6-3.txt', 'r')>>> f.read()'str1str2pythonabcdef\nABCDEF\n123456\nPython程序设计基础'>>> f.close()
2.4读写指针的重定位
seek(offset[, whence]):把文件指针移动到新的位置, offset表示相对于whence的位置。 whence为0: 表示从文件头开始计算,1表示从当前位置开始计算,2表示从文件尾开始计算。默认为0tell():返回文件指针的当前位置>>> f = open(r'E:\python\培训课件\p6-常用文件处理\code\test6-3.txt', 'r')>>> f.read(2)'st'>>> f.tell()2>>> f.read(2)'r1'>>> f.tell()4>>> f.seek(20)20>>> f.read(5)'\nABCD'>>> f.tell()26>>> f.close()
2.5其它文本文件
像以sql、pck、dsx、xml等为后缀的文本文件可以通过上面同样的方式来操作处理。
2.6将文件格式从windows(CRLF)转为unix(LF)
参考:python_open函数中newline参数详解_我是个烧饼啊的博客-CSDN博客_newline=
# 设置newline参数为'\n'file = r'E:\python\practice\转码\before.sql'with open(file, "r", encoding='utf-8', newline=None) as f:contents = f.readlines()save_file = r'E:\python\practice\转码\after.sql'with open(save_file, "w", encoding='utf-8', newline='\n') as save:save.writelines(contents)
三、Excel文件处理
python处理excel文件主要有以下方式:
xlrd、xlwt、xluntilspandasxlwingsopenpyxl模块......
样例数据:
下面详细介绍一下这几种用法
3.1xlrd、xlwt、xlutils.copy
应用场景:xls文件3.1.1 参考资料
基于xlrd、xlwt和openpyxl模块(xls文、xlsx文件)
使用python的xlrd,xlwt和xlutils.copy保留样式
Python中xlrd和xlwt模块使用方法(单元格样式)
xls文件保持原格式保存
python-批量修改Excel内的内容并保留原始格式
xlrd模块用法的一些总结
3.1.2xlrd模块 - 读操作
(1)获取工作簿对象(workbook)
import xlrdpath = r'E:\python\培训课件\p6-常用文件处理\code\工作簿1.xls'workbook = xlrd.open_workbook(path)'''open_workbook参数'''# open_workbook(filename=None, logfile=sys.stdout, verbosity=0, use_mmap=USE_MMAP, file_contents=None, encoding_override=None, formatting_info=False, on_demand=False, ragged_rows=False)## filename=None 要打开的文件路径## encoding_override=None 【】## formatting_info=False 【为True时保留文件原格式】
(2)获取工作表(sheet页签)
'''对workbook对象进行操作'''## 获取所有sheet的名称names = workbook.sheet_names() # 返回一个list对象print(names)## 1)通过索引获取worksheet = workbook.sheet_names()[0] # 第1个页签print(worksheet)## 2)通过索引顺序获取worksheet = workbook.sheet_by_index(0) # 第1个页签print(worksheet)## 3)通过sheet名称获取worksheet = workbook.sheet_by_name('第一个Sheet') # 第1个页签print(worksheet)
(3)获取工作表的信息
'''对sheet对象进行操作'''name = worksheet.name #获取表的姓名print(name)nrows = worksheet.nrows #获取该表总行数print(nrows)ncols = worksheet.ncols #获取该表总列数print(ncols)
(4)行和列的操作
"""row_values(rowx=0, start_colx=0, end_colx=None)-- rowx表示是获取第几行的数据-- start_col表示从索引为多少开始,end_colx表示从索引为多少结束,-- end_colx为None表示结束没有限制"""for n in range(nrows): # 逐行读取数据print(worksheet.row_values(n)) # 获取指定行的数据并以列表的形式返回,列表的每一项为字符串类型'''col_values(colx=0, start_rowx=0, end_rowx=None)'''print(worksheet.col_values(0)) # 获取第一列数据
(5)获取指定单元格的数据
# 可以通过坐标读取表格中的数据value1 = worksheet.cell_value(0, 3)value2 = worksheet.cell_value(1, 0)print(value1) # job参数print(value2) # s1value1 = worksheet.cell(0, 3).valueprint(value1) # job参数value1 = worksheet.row(0)[3].valueprint(value1) # job参数
3.1.3xlwt模块 -写操作
xlwt官方文档
(1) 单元格格式
import xlwtfrom datetime import datetime# (1) 单元格格式"""easyxf(strg_to_parse="", num_format_str=None,field_sep=",", line_sep=";", intro_sep=":", esc_char="\\", debug=False)"""style0 = xlwt.easyxf('font: name Times New Roman, color-index red, bold on',num_format_str='#,##0.00')style1 = xlwt.easyxf(num_format_str='D-MMM-YY')# (2) 新建工作簿wb = xlwt.Workbook()# 新建一个sheet页签ws = wb.add_sheet('test_sheet1')# (3) 写入单元格ws.write(0, 0, 1234.56, style0)ws.write(1, 0, datetime.now(), style1)ws.write(2, 0, '3') # A3ws.write(2, 1, '4') # B3ws.write(2, 2, xlwt.Formula("A3+B3")) # 公式 =A3+B3# (4) 保存到xls文件wb.save(r'E:\python\培训课件\p6-常用文件处理\code\result\xlwt.xls')
3.2pandas(待更新)
3.3xlwings、pandas
xlwings使用教程
sheet操作
import pandas as pdimport xlwings as xwpath = r'E:\python\培训课件\p6-常用文件处理\code\工作簿1.xls'save_path = r'E:\python\培训课件\p6-常用文件处理\code\工作簿1_out.xls'app = xw.App(visible=False, add_book=False)app.display_alerts = Falseapp.screen_updating = False # 是否实时刷新excel程序的显示内容wb = app.books.open(path)ws = wb.sheets[0]# 按行填充值# ws[1, 2].value = [1, 2]# 按列填充值# ws.range('C2').options(transpose = True).value = [1, 2, 3]# 获取行数df = pd.read_excel(path, header=0)row_num = len(df)para_list = []for i in range(row_num):para_list.append(ws[i+1, 4].value)ws[1, 2].options(transpose=True).value = para_list# 表格填充,多维数组# ws[1, 2].options(expand='table').value = [[1, 2], [3, 4]]# 删除最后几列的内容和格式rg = ws[0:, 3:]last_col = rg.clear()wb.save(save_path)wb.close()app.quit()
四、一二维数据的格式化和处理
4.1数据组织的维度
一维数据
一维数据由对等关系的有序或无序数据构成,采用线性方式组织,对应于数学中的数组和集合等概念。
二维数据
也称表格数据,由关联关系数据构成,采用表格方式组织,对应于数学中的矩阵,常见的表格都属于二维数据。
高维数据
高维数据由键值对类型的数据构成,采用对象方式组织,属于整合度更好的数据组织方式。 高维数据在网络系统中十分常用,HTML、 XML、 JSON等都是高维数据组织的语法结构。
五、word文档处理
1、安装python-docx模块
2、将一个word文档另存到几个新的word文档中
from docx import Documentmodel_file = Document('python内容.docx')with open(r'命名.txt') as f:con = f.read()all_name = con.split('\n')for name in all_name:model_file.save(name + '.docx')