目录
一、文件概述
--什么是文件?
- 文件:指存储在外存介质(如磁盘、光盘、U盘等)上的数据集合
- 文件名:通常由路径、主文件名、扩展名三部分组成 例如:D:\Python\test6-1.txt
import os
path = 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文件
- 本质上还是二进制文件
- 二进制文件:把内存中的数据,原样输出到磁盘文件中。
- 文件的内容不能直接阅读,而是提供给其它软件使用的
- 二进制文件不能使用 文本编辑软件 查看,需要使用特定的编辑器才能打开
- 如图片、视频文件等
- 文本文件:每一个字节存储1个字符,但一般占用存储空间较多
- 二进制文件直接由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’,表示使用文本的方式打开文件来读取
标识 | 含义 |
r | 只读模式打开文件,默认 |
w | 以只写模式打开文件,如果该文件已存在则先清空文件再写入。如果该文件不存在,创建新文件。 |
a | 以添加模式打开文件,写文件的时候总是写到文件末尾,用seek也无用。打开的文件也是不能读的 |
r+ | 以读写方式打开文件,文件可读可写,可写到文件的任何位置 |
w+ | 以读写方式打开文件,和r+不同的是,它会truncate the file first |
a+ | 以读写方式打开文件,和r+不同的是,它只能写到文件末尾 |
rb | 以二进制只读模式打开 |
wb | 以二进制只写模式打开,如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制追加模式打开,如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb+ | 以二进制读写模式打开 |
wb+ | 以二进制读写模式打开,如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ | 以二进制读写模式打开,如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
x | 创建写模式,文件不存在则创建,存在则返回异常 Fileexistserror |
file对象
- 属性
- closed
- mode
- name
- 方法
- 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.closed
False
>>> f.close()
>>> f.closed
True
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) # 文本逐行打印
...
abcdef
ABCDEF
123456
Python程序设计基础
>>> 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表示从文件尾开始计算。默认为0
- tell():返回文件指针的当前位置
>>> 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、xluntils
- pandas
- xlwings
- openpyxl模块......
样例数据:
参数1 说明: 1、os作业 2、sp作业 | 参数2 说明: 1、ds作业 2、ww作业 | 参数3 说明: 1、肯德基 2、哦大家 | job参数 | 数据源 |
c1 | s1 | dm | ||
c2 | s2 | edw | ||
c3 | s3 | ds | ||
c4 | s4 | ods |
下面详细介绍一下这几种用法
3.1 xlrd、xlwt、xlutils.copy
- 应用场景:xls文件
3.1.1 参考资料
基于xlrd、xlwt和openpyxl模块(xls文、xlsx文件)
使用python的xlrd,xlwt和xlutils.copy保留样式
3.1.2 xlrd模块 - 读操作
(1) 获取工作簿对象(workbook)
import xlrd
path = 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) # s1
value1 = worksheet.cell(0, 3).value
print(value1) # job参数
value1 = worksheet.row(0)[3].value
print(value1) # job参数
3.1.3 xlwt模块 - 写操作
(1) 单元格格式
import xlwt
from 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') # A3
ws.write(2, 1, '4') # B3
ws.write(2, 2, xlwt.Formula("A3+B3")) # 公式 =A3+B3
# (4) 保存到xls文件
wb.save(r'E:\python\培训课件\p6-常用文件处理\code\result\xlwt.xls')
3.2 pandas(待更新)
3.3 xlwings、pandas
import pandas as pd
import xlwings as xw
path = 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 = False
app.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 Document
model_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')