文件操作(IO技术):
文本文件:是用来存储字符的文件(记事本),就是文本文件,默认使用unicode字符集(两个字节表示一个字符)
二进制文件:把数据内容用“字节”进行储存,无法用记事本打开,必须用专用软件解码,常见有MP4文件、MP3文件、JPG文件、doc文档等
创建文件对象open():
open()函数用于创建文件对象,语法为:
open(文件名, [打开方式])
如果只是文件名,代表在当前目录下的文件,文件名可以录入全路径,比如: D:\a\b.txt,为了减少“\”的输入,可以使用原始字符串:r"d:\b.txt",示例如下:
f = open(r"d:\b.txt", "a")
a为模式,有多种:
r: 读模式
w: 写模式,如果文件不存在则创建;如果文件存在,则重写内容
a: 追加模式,如果文件不存在则创建;如果文件存在,则在文件末尾追加内容
b: 二进制模式(可与其他模式组合使用),如果没有表明使用该模式,文件默认为文本文件
+: 读、写模式(可与其他模式组合使用)
文本文件的写入:
操作:1、创建文件对象 2、写入数据 3、关闭文件对象
#示例
f = open(文件名)
f.write('写入的内容')
f.close()
Python程序执行时默认使用unicode编码程序,Windows操作系统默认是GBK,所以Python写入的文件在存储时会转为GBK格式,打开也需要GBK格式,否则会乱码
可以在Python写入文件时规定编码:
f = open(文件名,encoding = '编码')
write()和writelines()写入数据:
write() 是把字符串写入文件中
writelines() 是把字符串写入文件中,不添加换行符,需手动添加
close()关闭文件流:
try:
f = open(...)
f.write(...)
except BaseException as e:
print(e)
finally:
f.close()
with语句(上下文管理):
with会自动管理资源,执行完语句后会自动关闭资源
with open(...) as f:
f.writelines(...)
文本文件的读取:
1、read([size]): 从文件中读取size个字符,如果没有size参数1,默认读取整个文件
2、readline(): 读取一行作为返回结果,读取到文件末尾,会返回空字符串
3、readlines() 文本文件中每一行作为一个字符串存入列表,返回该列表
enumerate()函数,将对象和索引关联:
with open(r'e.txt', 'r', encoding= 'GBK') as f:
a = f.readlines()
b = [temp.rstrip() + ' #' + str(index) + '\n' for index, temp in enumerate(a)]
with open(r'e.txt', 'w', encoding='GBK') as f:
f.writelines(b)
二进制文件读写:
和文本文件一致,唯一需要注意模式加"b"
open('文件名', 'rb'/'wb'/'ab')
seek(offset, [whence]): 把文件指针移动到新的位置,offset表示相对于whence的多少个字节的偏移量;off为正往结束方向移动,off为负往开始方向移动;whence不同的值代表不同的含义,0为默认值,从文件头开始计算;1为当前位置开始计算;2从文件尾开始计算
tell():返回文件指针当前位置
truncate([size]):不论指针在什么位置,只留下指针前size个字节的内容,其余全部删除;如果没有size,则当前指针位置到文件末尾内容全部删除
flush():把缓冲区的内容写入文件,但不关闭文件
使用pickle序列化:
序列化指将程序中的对象,储存到硬盘或者通过网络传到其他地方
反序列化指将储存在硬盘中的数据转化成程序中的对象
pickle.dump(obj, file) obj就是要序列化的对象,file指储存的文件
pickle.load(file) 从file中读取数据,反序列化成对象
#将对象序列化到文件中
import pickle
with open('文件名', 'wb') as f:
a1 = 'Y'
a2 = 234
a3 = [3, 45, 1]
pickle.dump(a1, f)
pickle.dump(a2, f)
pickle.dump(a3, f)
#反序列化成对象
import pickle
with open('文件名', 'rb') as f:
a1 = pickle.load(f)
a2 = pickle.load(f)
a3 = pickle.load(f)
print(a1)
print(a2)
print(a3)
CSV文件操作:
#读取
import csv
with open('文件名.csv', 'r') as f:
a = csv.reader(f)
#写入
import csv
with open('e.csv', 'w', encoding='GBK') as f:
a = csv.writer(f)
a.writerow(['名字', '年龄', '成绩'])
a.writerow(['987', '3', 'Y'])
b = [['名字', '年龄', '成绩'], ['Y', '27', '100'], ['S', '24', '100']]
a.writerows(b)
os和os.path模块:
该模块能帮助我们直接对操作系统进行操作,我们可以直接调用操作系统的可执行文件、命令、直接操作文件、目录等
os调用操作系统文件和命令:
import os
os.system('notepad.exe') #调用记事本
#直接调用文件
import os
os.startfile(r'目标文件路径')
os模块,文件和目录操作:
os.remove(path) #删除指定文件
os.rename() #重命名文件或目录
os.stat(path) #返回文件所有属性
os.listdir(path) #返回path目录下的文件和目录列表
os.mkdir(path) #创建目录
os.makedirs(path1/path2...) #创建多级目录
os.rmdir(path) #删除一个目录
os.removedirs(path1/path2...) #删除多级目录
os.getcwd() #返回当前工作目录
os.chdir(path) #把path设为当前工作目录
os.walk() #遍历目录树
os.sep #当前操作系统所使用的路径分隔符
os.path()模块:
提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作
import os.path
os.path.isabs(path) #判断路径是否绝对路径
os.path.isdir(path) #判断路径是否为目录
os.path.isfile(path) #判断路径是否为文件
os.path.exists(path) #判断指定路径的文件是否存在
os.path.getsize(filename) #返回文件大小
os.path.abspath(path) #返回绝对路径
os.path.dirname(path) #返回目录路径
os.path.getatime(filename) #返回文件的最后访问时间
os.path.getmtime(filename) #返回文件的最后修改时间
os.path.walk(top, func, arg) #递归方式遍历目录
os.path.join(path, *paths) #连接多个路径
os.path.split(path) #对路径进行分割,以列表方式返回
os.path.splitext(path) #从路径中分割文件的扩展名
walk()递归遍历所有文件和目录:
os.walk()会返回一个3个元素的元组:
dirpath:要列出指定目录的路径
dirnames:目录下的所有文件夹
filenames:目录下的所有文件
shutil模块(拷贝和压缩):
相当于os模块的补充
import shutil
#拷贝
shutil.copyfile('文件名')
shutil.copytree('路径名', '新路径名', ignore = shutil.ignore_patterns('*.txt', '*.csv')) #如果目录已存在,报错
#压缩
shutil.make_archive('压缩去哪/压缩包名字', '压缩的格式', '压缩的内容')
递归算法:
递归结构包括两部分:
定义递归头:什么时候不用调用自身,没有头将陷入死循环
递归体:什么时候调用自身
#之前的例子,阶乘
def fac(n):
if n == 1:
return 1
else:
return n * fac(n - 1)
#循环的写法
a = int(input())
num = 1
while a > 0:
num *= a
a -= 1
#递归展示目录树
import os
allFiles = []
def getFiles(path, level):
childFile = os.listdir(path)
for file in childFile:
filepath = os.path.join(path, file)
if os.path.isdir(filepath):
getFiles(filepath, level + 1)
allFiles.append('\t' + level + filepath)
getFiles('目标目录', level)