python学习笔记10 文件 *** 作(IO 技术)

python学习笔记10 文件 *** 作(IO 技术),第1张

概述文件 *** 作1.文本文件和二进制文件2.文件 *** 作相关模块概述3.创建文件对象open()4.文本文件的写入4.1基本的文件写入 *** 作4.2常用编码介绍4.2.1ASCII4.2.2ISO8859-14.2.3GB2312,GBK,GB180304.2.4Unicode4.2.5UTF-84.3中文乱码问题4.4write()/writelines()写入数据4

文件 *** 作1.文本文件和二进制文件2. 文件 *** 作相关模块概述3.创建文件对象open()4.文本文件的写入4.1 基本的文件写入 *** 作4.2 常用编码介绍4.2.1 ASCII4.2.2 ISO8859-14.2.3 GB2312,GBK,GB180304.2.4 Unicode4.2.5 UTF-84.3 中文乱码问题4.4 write()/writelines()写入数据4.5 close()关闭文件流4.6 with 语句5.文本文件的读取5.1 read([size])5.2 readline()5.3 readlines()6.二进制文件的读取和写入7.文件对象的常用属性和方法8.pickle 序列化9.CSV 文件的 *** 作9.1 csv.reader 对象和csv 文件读取9.2 csv.writer 对象和csv 文件写入10. os 和os.path 模块10.1 os 模块-调用 *** 作系统命令10.2 os 模块-文件和目录 *** 作10.3 os.path 模块11. shutil 模块(拷贝和压缩)12. 递归算法

1.文本文件和二进制文件

一个完整的程序一般都包括数据的存储和读取,我们经常需要从外部存储介质(硬盘、光盘、U 盘等)读取数据,或者将程序产生的数据存储到文件中,实现“持久化”保存。

很多软件系统是将数据存储的数据库中;数据库实际也是基于文件形式存储的,按文件中数据组织形式,我们把文件分为文本文件和二进制文件两大类。

文本文件
文本文件存储的是普通“字符”文本,python 默认为unicode 字符集(两个字节表示一个字符,最多可以表示:65536 个),可以使用记事本程序打开。但是,像word 软件编辑的文档不是文本文件。

二进制文件
二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc 文档等等。

2. 文件 *** 作相关模块概述

3.创建文件对象open()

open()函数用于创建文件对象,基本语法格式如下:

open(文件名[,打开方式])

如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,比如:D:\a\b.txt。

为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”。示例如下:

f = open(r"d:\b.txt",“w”)

打开方式有如下几种:

4.文本文件的写入4.1 基本的文件写入 *** 作

文本文件的写入一般就是三个步骤:

创建文件对象写入数据关闭文件对象

【 *** 作】

f = open(r"a.txt","a")s = "abc\de\n"f.write(s)f.close()
4.2 常用编码介绍

在 *** 作文本文件时,经常会 *** 作中文,这时候就经常会碰到乱码问题。为了让大家有能力解决中文乱码问题,这里简单介绍一下各种编码之间的关系。

4.2.1 ASCII

美国信息交换标准代码,这是世界上最早最通用的单字节编码系统,主要用来显示现代英语及其他西欧语言。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。

4.2.4 Unicode

Unicode 编码设计成了固定两个字节,所有的字符都用16 位,包括之前只占8 位的英文字符等,所以会造成空间的浪费,UNICODE 在很长的一段时间内都没有得到推广应用。不兼容iso8859-1,也不兼容任何其他编码。

4.2.5 UTF-8

UTF 编码兼容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’) #可读的二进制文件对象

7.文件对象的常用属性和方法

文件对象的属性


文件对象的打开模式


文件对象的常用方法

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 格式文件的对象。

9.1 csv.reader 对象和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 模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的 *** 作

11. shutil 模块(拷贝和压缩)

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 技术)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1189506.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存