Python学习总结(一)——文件操作
1、文件类别
- 文本文件
文本文件存储的是普通“字符”文本,python 默认为 unicode 字符集(两个字节表示
一个字符,最多可以表示:65536 个),可以使用记事本程序打开。但是,像 word 软件编辑的文档不是文本文件。 - 二进制文件
二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件
解码。常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc 文档等等。
2、创建文件对象open()
操作类型:
模式 | 描述 |
---|---|
r | 读 read 模式 |
w | 写 write 模式。如果文件不存在则创建;如果文件存在,则重写新内容; |
a | 追加 append 模式。如果文件不存在则创建;如果文件存在,则在文件末尾追加内容 |
b | 二进制 binary 模式(可与其他模式组合使用) |
+ | 读、写模式(可与其他模式组合使用) |
示例代码:
f = open("../wenjian/IO.txt","w")
first = "The first python sentense."
f.write(first)
f.close()
注意:
文本文件对象和二进制文件对象的创建:如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。
3、文本文件的写入
write(a):把字符串 a 写入到文件中
writelines(b):把字符串列表写入文件中,不添加换行符
4、close()关闭文件流
为了确保打开的文件对象正常关闭,一般结合异常机制的 finally 或者 with 关键字实现无论何种情况都能关闭打开的文件对象。
(1)异常机制——示例代码
try:
f = open(r"yichang.txt","a")
message = "this is a message."
messagelist = ["first ","second ","third"]
messagelist01 = ["first\n","second\n","third\n"]
f.write(message+"\n") # write(a):把字符串 a 写入到文件中
f.writelines(messagelist) # writelines(b):把字符串列表写入文件中,不添加换行符
f.write("\n")
f.writelines(messagelist01)
except BaseException as e:
print(e)
finally:
f.close()
(2)with上下文管理器——示例代码
with open("yichang.txt","w") as f:
f.write("11")
5、文本文件的读取
文件的读取一般使用如下三个方法:
1. read([size])
从文件中读取 size 个字符,并作为结果返回。如果没有 size 参数,则读取整个文件。读取到文件末尾,会返回空字符串。
2. readline()
读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
3. readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表
示例代码:
with open("read.txt","r",encoding="utf-8") as f:
str = f.read(3) # 读取文件前3个字符
print("***********读取文件前3个字符*******************")
print(str)
with open("read.txt","r",encoding="utf-8") as f:
str = f.read() # 读取所有文件
print("************读取所有文件内容*******************")
print(str)
with open("read.txt","r",encoding="utf-8") as f:
str = f.readline() # 读取文件一行
print("*************读取文件第一行********************")
print(str,end="")
with open("read.txt","r",encoding="utf-8") as f:
str = f.readlines() # 按行读取文件所有内容
print("********按行读取文件所有内容,按列表返回**********")
print(str)
运行结果:
***********读取文件前3个字符*******************
I l
************读取所有文件内容*******************
I love jialun.
*************读取文件第一行********************
I love jialun.
********按行读取文件所有内容,按列表返回**********
['I love jialun.\n']
6、文件对象的常用属性和方法
常用属性:
属性 | 说明 |
---|---|
name | 返回文件的名字 |
mode | 返回文件的打开模式 |
closed | 若文件被关闭则返回 True |
常用方法:
方法名 | 说明 |
---|---|
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() | 把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源 |
常用方法之seek示例代码:
with open("read.txt","r",encoding="utf-8") as f:
print("文件名是:{0}".format(f.name))
print("指针位置1:",end="")
print(f.tell())
print("读文件一行:",end="")
print(f.readline(),end="")
print("指针位置2:", end="") #换行符\n占两个字符
print(f.tell())
f.seek(0,0)
print(f.readline(),end="")
f.seek(3,0)
print("指针位置3:", end="")
print(f.tell())
print(f.readline(),end="")
运行结果:
文件名是:read.txt
指针位置1:0
读文件一行:I love renjialun.
指针位置2:19
I love renjialun.
指针位置3:3
ove renjialun.
7、文件序列化
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
简单来说就是将多个对象转成一个流数据,进行传输。
我们可以使用 pickle 模块中的函数,实现序列化和反序列操作
序列化我们使用:
pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file) 从 file 读取数据,反序列化成对
示例:
import pickle
a1 = "yingtao"
a2 = 123
a3 = [1,2,3]
with open("data.dat","wb") as f: # 文件后缀名随便
pickle.dump(a1,f)
pickle.dump(a2,f)
pickle.dump(a3,f)
with open("data.dat","rb") as f:
b1 = pickle.load(f)
b2 = pickle.load(f)
b3 = pickle.load(f)
print("b1:{0}----b2:{1}----b3:{2}".format(b1,b2,b3))
print("id--a1:{0},b1:{1}".format(id(a1),id(b1))) #是两个不同的对象
运行结果:
b1:yingtao----b2:123----b3:[1, 2, 3]
id--a1:1868604569264,b1:1868606998576
8、CSV文件的读取
import csv
with open("csvfile.csv","w") as f:
write_csv = csv.writer(f)
write_csv.writerow(["ID","姓名","年龄"])
listwrite = [["1001","任嘉伦","32"],["1002","嘉人","22"]]
write_csv.writerows(listwrite)
with open("csvfile.csv","r") as f:
read_csv = csv.reader(f) #reader有一个指针,若两个print同时存在,则文件数据只打印一次
# print(list(read_csv))
for i in read_csv:
print(i)
运行结果:
['ID', '姓名', '年龄']
[]
['1001', '任嘉伦', '32']
[]
['1002', '嘉人', '22']
[]
以上方法中写入的文件中,每一行数据都会有一行空白行,解决的方法是:
with open("csvfile.csv","w",newline='') as f:
write_csv = csv.writer(f)
write_csv.writerow(["ID","姓名","年龄"])
listwrite = [["1001","任嘉伦","32"],["1002","嘉人","22"]]
write_csv.writerows(listwrite)
9、os模块以及os.path模块
os模块可以帮助我们直接对操作系统进行操作。
代码示例:
# os.system相当于Windows里面的Win+R快捷键调出的运行
import os
os.system("notepad.exe") #调出记事本
os.system("regedit") #调出注册表编辑器
os.system("ping www.baidu.com")
os.system("cmd")
# 直接调用可执行的文件
os.startfile(r"C:\Program Files\Oray\SunLogin\SunloginClient\SunloginClient.exe")
os对文件和目录的相关操作:
方法名 | 描述 |
---|---|
remove(path) | 删除指定的文件 |
rename(src,dest) | 重命名文件或目录 |
stat(path) | 返回文件的所有属性 |
listdir(path) | 返回 path 目录下的文件和目录列表 |
mkdir(path) | 创建目录 |
makedirs(path1/path2/path3/… ) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2…) | 删除多级目录 |
getcwd() | 返回当前工作目录:current work dir |
chdir(path) | 把 path 设为当前工作目录 |
walk() | 遍历目录树 |
sep | 当前操作系统所使用的路径分隔符 |
示例代码:
import os
############获取文件和文件夹相关的信息##################
print(os.name) # windows -> nt linux/unix -> posix
print(os.sep) # 路径分隔符 windows -> \ linux/unix -> /
print(repr(os.linesep)) # 给出当前平台使用的行终止符 windows -> \r\n linux/unix -> \n Mac -> \r
print(os.stat("OS_wenjian.py"))
###############关于文件工作目录的操作#########################
print(os.getcwd()) # 获取当前路径
os.mkdir("文件")
os.chdir("d:")
os.mkdir("wenjian")
os.rmdir("wenjian")
os.rmdir("文件")
os.makedirs("文件/python/01")
os.removedirs("文件/python/01") # 只能删除空目录
os.makedirs("../电影/港片/周星驰")
os.rename("../电影","../movie")
dir = os.listdir("../movie") # 只可以列出子目录,孙子节点无法列出
print(dir)
os.path模块:
常用方法:
方法 | 描述 |
---|---|
isabs(path) | 判断 path 是否绝对路径 |
isdir(path) | 判断 path 是否为目录 |
isfile(path) | 判断 path 是否为文件 |
exists(path) | 判断指定路径的文件是否存在 |
getsize(filename) | 返回文件的大小 |
abspath(path) | 返回绝对路径 |
dirname( p) | 返回目录的路径 |
getatime(filename) | 返回文件的最后访问时间 |
getmtime(filename) | 返回文件的最后修改时间 |
walk(top,func,arg) | 递归方式遍历目录 |
join(path,*paths) | 连接多个 path |
split(path) | 对路径进行分割,以列表形式返回 |
splitext(path) | 从路径中分割文件的扩展名 |
代码示例:
##########获得文件目录、文件的基本信息##################
# 是否为绝对路径
print(os.path.isabs("D:/Python/project/studyPython/wenjian/TXT/a.txt")) # True
# 是否为目录
print(os.path.isdir("D:/Python/project/studyPython/wenjian/TXT/a.txt")) # False
# 是否为文件
print(os.path.isfile("D:/Python/project/studyPython/wenjian/TXT/a.txt")) # True
# 文件是否存在
print(os.path.exists("D:/Python/project/studyPython/wenjian/TXT/a.txt")) # True
# 获取文件大小
print(os.path.getsize("D:/Python/project/studyPython/wenjian/TXT/a.txt")) # 74
# 输出绝对路径
print(os.path.abspath("./TXT/a.txt")) # D:\Python\project\studyPython\wenjian\TXT\a.txt
# 输出目录路径
print(os.path.dirname("D:/Python/project/studyPython/wenjian/TXT/a.txt")) # D:/Python/project/studyPython/wenjian/TXT
############获得文件的创建时间、最后访问时间、最后修改时间#####################
# 获取文件的创建时间
print(os.path.getctime("D:/Python/project/studyPython/wenjian/TXT")) # 1618641293.6957965
# 获取文件的最后访问时间
print(os.path.getatime("D:/Python/project/studyPython/wenjian/TXT")) # 1618641582.6866298
# 获取文件的最后修改时间
print(os.path.getmtime("D:/Python/project/studyPython/wenjian/TXT")) # 1618641535.1860154
##############对文件路径进行分割、连接操作######################
path = os.path.abspath("./TXT/a.txt")
# 对文件路径进行分割,获取文件名
print(os.path.split(path)) # ('D:\\Python\\project\\studyPython\\wenjian\\TXT', 'a.txt')
# 对文件路径进行分割,获取文件扩展名
print(os.path.splitext(path)) # ('D:\\Python\\project\\studyPython\\wenjian\\TXT\\a', '.txt')
# 对多个路径进行连接
print(os.path.join("aa","bb","cc")) # aa\bb\cc
os.walk方法遍历所有文件及目录:
os.walk方法:
返回一个 3 个元素的元组,(dirpath, dirnames, filenames),
dirpath:要列出指定目录的路径
dirnames:目录下的所有文件夹
filenames:目录下的所有文件
代码示例:
import os
all_file = []
path = os.getcwd()
file_list = os.walk(path)
for dirpath,dirnames,filenames in file_list:
for dirname in dirnames:
# print(dirname)
# print("######################")
all_file.append(os.path.join(dirpath,dirname))
for filename in filenames:
# print(filename)
all_file.append(os.path.join(dirpath,filename))
print(all_file)
文件的拷贝、压缩与解压缩:
'''
shutil 模块是 python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作。
'''
import shutil
########文件复制################
# 复制文件内容
shutil.copyfile("read.txt","./TXT/copy_read.txt")
# 复制文件目录
shutil.copytree("movie/港片","电影") # 电影文件夹存在时无法执行此语句,原因是防止文件覆盖
# 选择性复制文件目录
shutil.copytree("movie/港片","选择电影",ignore=shutil.ignore_patterns("*.txt","*.html"))
########文件压缩################
# 使用shutil压缩文件
shutil.make_archive("压缩/01","zip","电影") # 第一个参数是压缩之后的路径,第二个参数是压缩文件的后缀,第三个参数是需要压缩文件的位置
import zipfile
# 使用zipfile压缩文件,使用此方法进行压缩更为精细
z1 = zipfile.ZipFile("压缩/02.zip","w") # 第一个参数是压缩文件后的路径及名称,第二个参数表示了压缩与解压缩的区别,w是压缩,r是解压缩
z1.write("csvfile.csv")
z1.write("GBK.txt")
z1.close()
# 使用zipfile解压缩文件
z2 = zipfile.ZipFile("压缩/02.zip","r")
z2.extractall("解压缩")
z2.close()