一个完整的程序一般都包括数据的存储和读取,我们经常需要从外部存储介质(硬盘、光盘、U 盘等)读取数据,或者将程序产生的数据存储到文件中,实现“持久化”保存。
很多软件系统是将数据存储的数据库中;数据库实际也是基于文件形式存储的,按文件中数据组织形式,我们把文件分为文本文件和二进制文件两大类。
文本文件
文本文件存储的是普通“字符”文本,python 默认为unicode 字符集(两个字节表示一个字符,最多可以表示:65536 个),可以使用记事本程序打开。但是,像word 软件编辑的文档不是文本文件。
二进制文件
二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc 文档等等。
open()函数用于创建文件对象,基本语法格式如下:
open(文件名[,打开方式])
如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,比如:D:\a\b.txt。
为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”。示例如下:
f = open(r"d:\b.txt",“w”)
打开方式有如下几种:
文本文件的写入一般就是三个步骤:
创建文件对象写入数据关闭文件对象【 *** 作】
f = open(r"a.txt","a")s = "abc\de\n"f.write(s)f.close()
4.2 常用编码介绍在 *** 作文本文件时,经常会 *** 作中文,这时候就经常会碰到乱码问题。为了让大家有能力解决中文乱码问题,这里简单介绍一下各种编码之间的关系。
美国信息交换标准代码,这是世界上最早最通用的单字节编码系统,主要用来显示现代英语及其他西欧语言。ASCII 码用7 位表示,只能表示128 个字符。用7bit 即可完全编码,而一字节8bit 的容量是256,所以一字节ASCII 的编码最高位总是0。
4.2.2 ISO8859-1在ASCII 编码之上又增加了西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号,它是向下兼容ASCII 编码
4.2.3 GB2312,GBK,GB18030·GB2312
GB2312 全称为信息交换用汉字编码字符集,是中国于1980 年发布,GB2312 覆盖了汉字的大部分使用率,但不能处理像古汉语等特殊的罕用字,所以后来出现了像GBK、GB18030 这种编码。GB2312 完全兼容ISO8859-1。
·GBK
它主要是扩展了GB2312,在它的基础上又加了更多的汉字。
·GB18030
它主要采用单字节、双字节、四字节对字符编码,它是向下兼容GB2312 和GBK 的,虽然是我国的强制使用标准,但在实际生产中很少用到,用得最多的反而是GBK 和GB2312。
Unicode 编码设计成了固定两个字节,所有的字符都用16 位,包括之前只占8 位的英文字符等,所以会造成空间的浪费,UNICODE 在很长的一段时间内都没有得到推广应用。不兼容iso8859-1,也不兼容任何其他编码。
4.2.5 UTF-8UTF 编码兼容iso8859-1 编码,同时也可以用来表示所有语言的字符,不过,UTF 编码是不定长编码,每一个字符的长度从1-4 个字节不等。其中,英文字母都是用一个字节表示,而汉字使用三个字节。
4.3 中文乱码问题windows *** 作系统默认的编码是GBK,linux *** 作系统默认的编码是UTF-8。当我们用open()时,调用的是 *** 作系统打开的文件,默认的编码是GBK。
可通过指定文件编码解决中文乱码问题:
f = open(r"b.txt",“w”,enCoding=“utf-8”)
即:文件建的时候编码用UTF-8
4.4 write()/writelines()写入数据write(a):把字符串a 写入到文件中。
writelines(b):把字符串列表写入文件中,不添加换行符。
【 *** 作】添加字符串列表数据到文件中
f = open(r"d:\bb.txt","w",enCoding="utf-8")s = ["一\n","二\n","三\n"]f.writelines(s)f.close()
4.5 close()关闭文件流由于文件底层是由 *** 作系统控制,所以我们打开的文件对象必须显式调用close()方法关闭文件对象。当调用close()方法时,首先会把缓冲区数据写入文件,再关闭文件,释放文件对象。
【 *** 作】结合异常机制finally 确保关闭文件对象
try: f = open(r"01.txt","a") str = "wq" f.write(str)except BaseException as e: print(e)finally: f.close()
4.6 with 语句with 关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出with 块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。
【 *** 作】使用with 管理文件写入 *** 作
s = ["一\n","二\n","三\n"]with open(r"d:\bb.txt","w") as f: f.writelines(s)
5.文本文件的读取5.1 read([size])从文件中读取size 个字符,并作为结果返回。如果没有size 参数,则读取整个文件。读取到文件末尾,会返回空字符串。
【 *** 作】读取一个文件前4 个字符
with open(r"bb","r",enCoding="utf-8") as f: print(f.read(4))
5.2 readline()读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
【 *** 作】按行读取一个文件
with open(r"bb.txt","r") as f: while True: fragment = f.readline() if not fragment: break else: print(fragment,end="")
5.3 readlines()文本文件中,每一行作为一个字符串存入列表中,返回该列表
【 *** 作】为文本文件每一行的末尾增加行号
with open("e.txt","r",enCoding="utf-8") as f: lines = f.readlines() lines = [ line.rstrip()+" #"+str(index+1)+"\n" for index,line in enumerate(lines)] #推导式生成列表with open("e.txt","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’) #可读的二进制文件对象
文件对象的属性
文件对象的常用方法
read([size]):从文件中读取size 个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容
readline():从文本文件中读取一行内容
readlines():把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
write(str):将字符串str 内容写入文件
writelines(s):将字符串列表s 写入文件文件,不添加换行符
seek(offset,[whence]):把文件指针移动到新的位置,offset 表示相对于whence 的多少个字节的偏移量;
tell():返回文件指针的当前位置
truncate([size]):不论指针在什么位置,只留下指针前size 个字节的内容,其余全部删除;如果没有传入size,则当指针当前位置到文件末尾内容全部删除
flush():把缓冲区的内容写入文件,但不关闭文件
close():把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源
【示例】seek()移动文件指针示例
with open("e.txt","r",enCoding="utf-8") as f: print("文件名是:{0}".format(f.name)) print(f.tell()) print("读取的内容:{0}".format(str(f.readline()))) print(f.tell()) f.seek(0,1) print("读取的内容:{0}".format(str(f.readline())))
8.pickle 序列化Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。
反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
可以使用pickle 模块中的函数,实现序列化和反序列 *** 作。
序列化我们使用:
pickle.dump(obj, file)
obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file) 从file 读取数据,反序列化成对象
【 *** 作】将对象序列化到文件中
import picklewith open(r"data.dat","wb") as f: a1 = "一一" a2 = 234 a3 = [20, 30, 40] pickle.dump(a1, f) pickle.dump(a2, f) pickle.dump(a3, f)
【 *** 作】将获得的数据反序列化成对象
import picklewith open(r"data.dat","rb") as f: b1 = pickle.load(f) b2 = pickle.load(f) b3 = pickle.load(f) print(b1);print(b2);print(b3)
执行结果
一一234[20, 30, 40]
9.CSV 文件的 *** 作csv是逗号分隔符文本格式,常用于数据交换、Excel
文件和数据库数据的导入和导出,Python 标准库的模块csv 提供了读取和写入csv 格式文件的对象。
【 *** 作】csv.reader 对象于从csv 文件读取数据
import csvwith open(r"dd.csv","r") as f: a_csv = csv.reader(f) for row in a_csv: print(row)
执行结果
['ID', '姓名', '年龄', '薪资']['1001', '王一', '18', '50000']['1002', '王二', '19', '30000']['1003', '王三', '20', '20000']
9.2 csv.writer 对象和csv 文件写入【 *** 作】csv.writer 对象写一个csv 文件
with open("ee.csv","w") as f: b_csv = csv.writer(f) b_csv.writerow(["ID","姓名","年龄"]) b_csv.writerow(["1001","王一","18"]) c = [["1002","王二","3"],["1003","王三","4"]] b_csv.writerows(c)
执行结果
ID,姓名,年龄1001,王一,181002,王二,31003,王三,4
10. os 和os.path 模块os 模块可以帮助我们直接对 *** 作系统进行 *** 作。我们可以直接调用 *** 作系统的可执行文件、命令,直接 *** 作文件、目录等等。
10.1 os 模块-调用 *** 作系统命令os.system 可以帮助我们直接调用系统的命令【示例】os.system 调用windows 系统的记事本程序
import osos.system("notepad.exe")
os.startfile:直接调用可执行文件【示例】运行安装好的微信
import osos.startfile(r"C:\Program files (x86)\Tencent\WeChat\WeChat.exe")
10.2 os 模块-文件和目录 *** 作我们可以通过前面的文件对象实现对于文件内容的读写 *** 作。如果还需要对文件和目录做其他 *** 作,可以使用os 和os.path 模块。
os 模块下常用 *** 作文件的方法
os 模块下关于目录 *** 作的相关方法
【示例】os 模块:关于文件和目录的 *** 作
import osprint(os.stat("02.py"))#获得文件相关信息print(os.getcwd())#返回当前工作目录#os.chdir("d:") #改变当前的工作目录为:d:盘根目录os.mkdir("书籍")#创建子目录书籍#os.rmdir("书籍")删除目录os.makedirs("电影/港台/周星驰")#创建多级目录#os.removedirs("电影/港台/周星驰")#只能删除空目录os.makedirs("../音乐/香港/刘德华")#../指的是上一级目录os.rename("电影","movIE")#重命名print(os.Listdir("movIE"))#列一级子目录
10.3 os.path 模块os.path 模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的 *** 作
shutil 模块是python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做
文件和文件夹的压缩、解压缩 *** 作。
【示例】实现文件的拷贝
import shutil#copy 文件内容shutil.copyfile("1.txt","1_copy.txt")
【示例】实现将文件夹所有内容压缩(使用shutil 模块)
import shutilimport zipfile#将"电影/学习"文件夹下所有内容压缩到"音乐2"文件夹下生成movIE.zip的格式shutil.make_archive("音乐2/movIE","zip","电影/学习")#压缩:将指定的多个文件压缩到一个zip 文件z = zipfile.Zipfile("a.zip","w")#生成新压缩包z.write("1.txt")#写入压缩文件z.close()
【示例】实现将压缩包解压缩到指定文件夹(使用shutil 模块)
shutilimport zipfile#解压缩:z = zipfile.Zipfile("a.zip","r")z.extractall("d:/") #设置解压的地址z.close()
12. 递归算法【示例】使用递归算法遍历目录下所有文件
import osallfile = []def getfiles(path,level): childfiles = os.Listdir(path) for file in childfiles: filepath = os.path.join(path,file) if os.path.isdir(filepath): getfiles(filepath,level+1) allfile.append("\t"*level+filepath)getfiles(os.getcwd(),0)for f in reversed(allfile): print(f)
level表示缩进
总结以上是内存溢出为你收集整理的python学习笔记10 文件 *** 作(IO 技术)全部内容,希望文章能够帮你解决python学习笔记10 文件 *** 作(IO 技术)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)