文章目录
1. 文本文件和二进制文件:
- 文本文件:存储普通字符文本,默认为unicode字符集(两个字节表示一个字符)最多可以表示 65536个
- 二进制文件:内容用“字节”进行存储,无法用记事本打开,常见的有:视频、音频、图片、DOC文件
2.文件操作相关模块
- io 文件流的输入输出
- os 基本操作系统功能
- glob 查找符合特定规则的文件路径名
- fnmatch 使用模式来匹配文件的路径名
- fileinput 处理多个输入文件
- filecmp 用于文件比较
- cvs 用于cvs文件处理
- pickle & cPickle 用于序列化和反序列化
- xml 用于XML数据处理
- bz2 gzip zipfile zlib tarfile 用于处理压缩和解压缩文件 分别对应不同的算法
3.创建文件对象
open(): open(filename [,openmodel]) : f = open(r “d:\b.txt”, “a”)
如果只是文件名,则代表在当前目录下的文件;文件名可以录入全路径;r 则减少\的输入
- 打开方式:
- r 读模式
- w 写模式 如果文件不存在则创建,若存在,则重新读写内容
- a 追加模式 append 文件不存在则自动创建
- b 二进制模式 binary 没写b 则默认为文本文件
- + 读写模式
4.常见编码方式
- ASCII 7位 只能表示128个字符
- SIO8859-1 8位表示1字符,能表示256个字符,兼容ASCII
- GBK GB2312 GB18030 国标 汉字2字节
- Unicode 定长编码,2字节表示一个字符 python默认使用的编码形式
- UTF-8 变长编码 1-4个字节表示一个字符 英文一个字节,汉字3个字节
5.文件的写入步骤
- 创建文件对象
- 写入数据
- 关闭文件对象
一共有三种比较常见的方式,记录如下:
filename = "my01.txt"
f = open(filename,'w', encoding='UTF-8')
s = "OLG\nHello\n小可爱\n"
f.write(s)
f.close() # 关闭文件流
try:
f = open(r"test/my02.txt","a") # 先写入缓存区
str = "hello,my02"
f.write(str) #再将内容写入文件
except BaseException as e:
print(e)
finally:
f.close()
# with语句 上下文管理器:自动管理上下文资源,不管什么原因跳出with块,都能确保文件正常关闭:
s = ["小可爱\n","hello\n"]
with open(r"my03.txt","a",encoding="UTF-8") as f:
f.writelines(s) #逐行写入
6.文件的读取
- read([size]) 从文件中读取size个字符串,并作为结果返回。如果没有size,则读取整个文件至末尾,会返回空字符串
- readline() 读取一行作为结果返回。读取到文件末尾,会返回空字符串
- readlines() 文本文件中,每一行作为一个字符串存入列表中,返回该列表
with open("test/my01.txt",'r',encoding='UTF-8') as f:
for a in f:
print(a,end=" ")
注:enumerate() 添加序号
a = ['a\n','b\n','c\n']
b = enumerate(a)
print(a)
print(list(b)) #b:(0,‘cao’)。。。
# 读取行号
c = [temp.rstrip() + " # " + str(index) for index,temp in enumerate(a)] # .rstrip() 去分隔符\n
# print(c)
with open('caotest/my01.txt','r',encoding='utf-8') as f:
lines = f.readlines()
lines = [line.rstrip() + '#' + str(index) + '\n' for index,line in enumerate(lines)]
print(lines)
7.二进制文件的读取与写入
- file_mode = wb rb ab 其余内容相同
8.文件对象的常用属性和方法
- 属性:
- name
- mode
- closed
- 打开模式:
- r
- w
- a
- b
- +
- 文件对象常用方法:
-
read([size])
-
readline()
-
readlines()
-
write(str)
-
writelines(str) 不添加换行符
-
seek(offset[,whence]) 把文件指针移到新的位置,offset表示相对于whence的位置
- offset:
- off为正 往结束方向移动;为负 往开始方向移动
- whence:
- 0 从文件头开始
- 1 从当前位置开始计算
- 2 从文件尾开始计算
- offset:
-
tell() 返回文件指针的当前位置
-
truncate(size) 无论在什么位置,只留下指针前size个字节的内容,其余全部删除
-
flush() 把缓冲区的内容写入文件,但不关闭文件
-
close() 把缓冲区的内容写入文件,同时关闭文件,释放相关资源
with open('caotest/my01.txt','r',encoding='utf-8') as f:
print('filename:{0}'.format(f.name))
print(f.tell()) #读取文件指针位置
print('读取内容:{0}'.format(str(f.readline())))
print(f.tell())
f.seek(5) #改变文件的指针位置
print('读取的内容:{0}'.format(str(f.readline())))
9.使用pickle序列化
python中,一切皆对象,本质是一个“存储数据的内存块”,
- 序列化:将对象转换成“串行比”的数据形式,存储到硬盘或网络传输到其他地方
- 反序列化:相反的过程,将读取到的“串行化数据”转换成对象
- pickle().dump(obj,file) obj即是要被序列化的对象,file指的是存储的文件
- pickle().load(file) 从file读取数据,反序列化成对象
# 序列化
with open(r'caotest/my07.txt','wb') as f:
a1 = 'caoyh'
a2 = 235
a3 = [20,30,50]
a4 = '小可爱'
pickle.dump(a1,f)
pickle.dump(a2, f)
pickle.dump(a3, f)
pickle.dump(a4,f)
# 反序列化
with open('test/my07.txt','rb') as f:
for a in (a1,a2,a3,a4):
a = pickle.load(f)
print(a)
10.CSV文件的操作
- csv是都好分隔符文本格式,常用于数据交换、
- Excel文件和数据库数据的导出和导入
与Excel文件不同,csv文件中- 值没有类型,所有值都是字符串
- 不能指定字体颜色等样式
- 不能指定单元格高宽,不能合并单元格
- 没有多个工作表
- 不能嵌入图像
import csv
with open('example-write.csv','r',encoding='utf-8') as f:
a_csv = csv.reader(f)
# print(a_csv)
# print('*'*20)
# print(list(a_csv))
# print('*' * 20)
for row in a_csv:
print(row)
# csv文件写入
with open('example.csv','w') as f:
b_csv = csv.writer(f)
b_csv.writerow(["005","bb","18","1000"])
11.os与os.path模块
- os.system() 直接调用系统命令 os.system(“notepad.exe”)
- os.system() 调用window系统的ping命令 os.system(“ping www.baidu.com”)
os模块
import os
os.system('cmd')
# 直接打开应用
os.startfile(r'C:\Program Files (x86)\Sangfor\SSL\SangforCSClient.exe')
'''
获取文件和文件夹的相关信息
'''
print(os.name) # 返回操作系统的名字 window-->nt linux/unix-->posix
print(os.sep) # 返回操作系统的分隔符 window-->\ linux unix-->/
print(repr(os.linesep)) # window-->\r\n linux unix-->\n\
print(os.stat('my01.txt')) # 获取文件信息
'''
创建目录,创建多级目录,删除目录
'''
#返回当前工作目录
print(os.getcwd())
#创建子目录
# os.mkdir("bookcaoyh")
#先指定目录,再创建子目录
os.chdir("D:/")
os.mkdir("caoyh")
'''
创建目录,创建多级目录,删除目录
'''
os.mkdir("小可爱") #创建目录
os.rmdir("cao") #删除目录
os.makedirs("cao/y/h") #创建多级目录
os.removedirs("cao/y/h") #删除多及目录 只能是空的才可以
os.makedirs("../cao/y") #../ 指的是上一级目录
os.rename("小可爱","cao") # 修改目录名字
dirs = os.listdir("caoyh") #列出一级子目录和子文件
print(dirs)
os.path模块
import os.path
#### 指的是相对路径
############判断:绝对路径、是否目录、是否文件、文件是否存在###################
print(os.path.isabs("d:/onedrive")) # True
print(os.path.isdir("d:/onedrive")) # True
print(os.path.isfile("d:/a.txt")) # False
print(os.path.exists("d:/onedrive"))# True
############## 获取文件的基本信息 #############################
print(os.path.getsize("my01.txt")) #获得文件大小
print(os.path.abspath("my01.txt")) #获得文件的绝对路径
print(os.path.dirname("my01.txt")) #获得文件的相对路径
################ 路径的操作 ########################
path = os.path.abspath("my01.txt")
path2list = os.path.split(path)
print(path2list)
print(os.path.splitext(path))
print(os.path.join('caoyh','join'))
'''
练习指定目录下的所有.py文件,并输出文件名
'''
import os
path = os.getcwd()
file_list = os.listdir(path)
for filename in file_list:
if filename.endswith("py"):
print(filename,end='\t')
print('\n'+"*"*20)
file_list2 = [filename for filename in os.listdir(path) if filename.endswith(".py")]
for f in file_list2:
print(f,end='\t')
os.walk() 递归遍历所有文件
'''
测试os.walk()递归遍历所有的子目录和文件夹
'''
path = os.getcwd()#返回绝对路径
print(path+'\n')
list_files = os.walk(path)
for dirpaths,dirnames,filenames in list_files:
for dir in dirnames:
print(os.path.join(dirpaths,dir))
# print('*'*20)
for file in filenames:
print(os.path.join(dirpaths,file))
12.shutil模块(拷贝和压缩)
## shutil : 拷贝和压缩
import shutil
# 拷贝文件
shutil.copyfile('1.txt','1_copy.txt')
# 拷贝文件夹 以及其中的内容 只能拷贝一次,多次则报错
shutil.copytree('movie','example')
# 压缩 解压缩
shutil.make_archive('example/haha','zip','movie') # 将movie文件夹下的文件,以zip格式压缩至example文件夹下命名为haha
import zipfile
# z1 = zipfile.ZipFile('z1.zip','w')
# z1.write('1.txt')
# z1.write('1_copy.txt')
# z1.close()
z2 = zipfile.ZipFile('z1.zip','r')
z2.extractall('z2')
z2.close()