文章目录
1. file文件操作;操作系统底层关系;写入文件
1. 文本文;二进制文件
-
文本文件:文本文件存储的事普通“字符”文本,默认为Unicode字符集(两个字节表示一个字符,最多可以表示65536个),可以使用记事本程序打开,但是,像Word文件编辑的文档不是文本文件。
-
二进制文件:二进制文件把数据内容用“字节”进行存储,无法使用记事本打开。必须用专用的软件解码。常见的有:MP4视频文件,MP3音频文件,JPG图片,doc文档等。
-
文件操作相关模块概述
2. 创建文件对象 open()
-
open()
函数用于创建文件对象,基本语法:open(文件名, [打开方式])
-
打开方式:
- 文本文件对象和二进制文件对象的创建:如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字
符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。
- 基本的文件操作:(三步走)
- 创建文件对象
- 写入数据
- 关闭文件对象
f = open(r'a.text','a')
# 在当前python执行的路径下创建‘a.text’文件
s = 'xxxxxxx'
f.write(s)
f.close()
2. 编码知识;中文乱码问题解决
- 常用编码介绍
- windows 操作系统默认的编码是GBK,Linux 操作系统默认的编码是UTF-8。当我们用open()时,调用的是操作系统打开的文件,默认的编码是GBK。
f = open(r'b.text','w')
f.write('xx\xx\yy')
f.close()
# 文件显示乱码
# 解决方案
f = open(r'b.text','w',encoding='utf-8')
f.write('xx\xx\yy')
f.close()
3. 关闭流要点;try异常管理
1. write() / writelines()写入数据
- write(a):把字符串a写到文件中
- writelines(b):把字符串列表写入文件中,不添加换行符
f = open(r'd:/bb.text','w',encoding='utf-8')
s = ['XX\n','YY\n','ZZ\n'] # 需要手动换行
f.writelines(s)
f.close()
2. close()关闭文件流
-
由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用
close()
方法关闭文件对象。当调用close()
方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()
方法),再关闭文件,释放文件对象。 为了确保打开的文件对象正常关闭,一般结合异常机制的
finally
或者with
关键字实现无论何种情况都能关闭打开的文件对象。
try:
f = open(r'my01.text','a')
str = 'XXXYYY'
f.write(str)
except BaseException as e:
print(e)
finally:
f.close()
3. with语句(上下文管理器)
with
关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出with
块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。
s = ['xx','yy','ii']
with open(r'd:/aa.text','w') as f:
f.writelines(s)
4. 文本文件的读取
-
read([size])
:从文件中读取size 个字符,并作为结果返回。如果没有size 参数,则读取整个文件。读取到文件末尾,会返回空字符串。 -
readline()
:读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。 -
readlines()
:文本文件中,每一行作为一个字符串存入列表中,返回该列表。
# 读取前4个字符
try:
with open(r'e.text','r',encoding='utf-8') as f:
print(f.read(4))
except BaseException as e:
print(e)
# 按行读取一个文件
with open(r'e.text', 'r', encoding='utf-8') as f:
for a in f:
print(a, end='')
5. enumerate()函数和推导式生成列表;操作每行增加行号
with open(r'e.text', 'r', encoding='utf-8') as f:
lines = f.readlines()
lines = [temp.rstrip() + '#' + str(index + 1) + '\n'
for index, temp in enumerate(lines)]
with open(r'e.text', 'w', encoding='utf-8') as f:
f.writelines(lines)
6. 二进制文件的读取和写入;图片文件拷贝
-
二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建出二进制文件对象。例如:
f = open(r"d:\a.txt", 'wb') #可写的、重写模式的二进制文件对象
f = open(r"d:\a.txt", 'ab') #可写的、追加模式的二进制文件对象
f = open(r"d:\a.txt", 'rb') #可读的二进制文件对象
# 把二进制文件“a.gif”拷贝到“aa_copy.gif”
with open(r'aa.gif','rb') as f:
with open(r'aa_copy.gif','wb') as w:
for line in f.readlines():
w.write(line)
print('拷贝完成!')
7. 文件对象常用方法和属性总结;seek()任意位置操作
1. 文件对象常用方法总结
- 文件对象的属性
属性 | 说明 |
---|---|
name | 返回文件的名字 |
mode | 返回文件的打开模式 |
closed | 若文件被关闭则返回True |
- 文件对象的打开方式
模式 | 说明 |
---|---|
r | 读模式 |
w | 写模式 |
a | 追加模式 |
b | 二进制模式(可与其他模式组合) |
+ | 读写模式(可与其他模式组合) |
- 文件对象的常用方法
方法名 | 说明 |
---|---|
read([size]) | 从文件中读取size 个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容 |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
write(str) | 将字符串str 内容写入文件 |
writelines(s) | 将字符串列表s 写入文件文件,不添加换行符 |
seek(offset[,whence]) | 把文件指针移动到新的位置,offset 表示相对于whence 的多少个字节的偏移量offset: off 为正往结束方向移动,为负往开始方向移动 whence 不同的值代表不同含义: 0: 从文件头开始计算(默认值) 1:从当前位置开始计算 2:从文件尾开始计算 |
tell() | 返回文件指针的当前位置 |
truncate([size]) | 不论指针在什么位置,只留下指针前size 个字节的内容,其余全部删除;如果没有传入size,则当指针当前位置到文件末尾内容全部删除 |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源 |
2. seek()任意操作
-
语法:
seek(offset[ ,whence])
-
参数:
-
把文件指针移动到新的位置,offset 表示相对于whence 的多少个字节的偏移量offset:
-
off 为正往结束方向移动,为负往开始方向移动
-
whence 不同的值代表不同含义:
0: 从文件头开始计算(默认值)
1:从当前位置开始计算
2:从文件尾开始计算
-
with open(r'e.text', 'r', encoding='utf-8') as f:
print('文件名是:%s' % f.name)
print(f.tell())
f.seek(3, 0)
print('读取的内容:{0}'.format(f.readline()))
print(f.tell())
8. 使用pickle序列化
-
序列化:
Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。对象的序列化机制广泛的应用在分布式、并行系统上。
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
我们可以使用pickle 模块中的函数,实现序列化和反序列操作。 -
语法:
pickle.dump(obj, file)
:obj是要被序列化的对象,file指得是存储的文件pickle.load(file):
从file读取数据,反序列化成对象
- 将对象序列化到文件中
import pickle
with open(r"d:\data.dat","wb") as f:
a1 = "高淇"
a2 = 234
a3 = [20,30,40]
pickle.dump(a1,f)
pickle.dump(a2, f)
pickle.dump(a3, f)
# 反序列化
with open(r"d:\data.dat","rb") as f:
a1 = pickle.load(f)
a2 = pickle.load(f)
a3 = pickle.load(f)
print(a1)
print(a2)
print(a3)
print(id(a1))
print(id(b1))
- 将获得的数据反序列化成对象
import pickle
with open(r"d:\data.dat","rb") as f:
b1 = pickle.load(f)
b2 = pickle.load(f)
b3 = pickle.load(f)
print(b1)
print(b2)
print(b3)
print(id(a1))
print(id(b1))
9. CSV文件的读取、写入
-
CSV (Comma Separated Values) 是“逗号”分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。与Excel 文件不同,CSV 文件中:
-
值没有类型,所有值都是字符串
-
不能指定字体颜色等样式
-
不能指定单元格的宽高,不能合并单元格
-
没有多个工作表
-
不能嵌入图像图表
-
-
Python 标准库的模块csv 提供了读取和写入csv 格式文件的对象。
csv.reader(f)
:对象于从csv 文件读取数据csv.writer(f)
:对象写一个csv 文件- 示例:
import csv
# 从csv文件中读数据
with open(r'dd.csv', 'r') as f:
a_csv = csv.reader(f)
print(a_csv)
# print(list(a_csv))
for row in a_csv:
print(row)
# 向csv写数据
with open(r'dd.csv', 'w') as f:
b_csv = csv.writer(f)
b_csv.writerow(['ID', '姓名', '年龄'])
b_csv.writerow(['1001', 'zwj', '25'])
c = [['1002', 'yyy', '22'], ['1003', 'aaa', '22']]
b_csv.writerow()