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

1531-王同学

发表文章数:16

首页 » Python » 正文

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

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

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

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

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

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

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

3.创建文件对象open()

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

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

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

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

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

打开方式有如下几种:
python学习笔记10 文件操作(IO 技术)

4.文本文件的写入

4.1 基本的文件写入操作

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

  1. 创建文件对象
  2. 写入数据
  3. 关闭文件对象

【操作】

f = open(r"a.txt","a")
s = "abc/de/n"
f.write(s)
f.close()

4.2 常用编码介绍

在操作文本文件时,经常会操作中文,这时候就经常会碰到乱码问题。为了让大家有能力解决中文乱码问题,这里简单介绍一下各种编码之间的关系。
python学习笔记10 文件操作(IO 技术)

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.文件对象的常用属性和方法

文件对象的属性
python学习笔记10 文件操作(IO 技术)
文件对象的打开模式
python学习笔记10 文件操作(IO 技术)
文件对象的常用方法

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 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。
python学习笔记10 文件操作(IO 技术)
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。
反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。

可以使用pickle 模块中的函数,实现序列化和反序列操作。

序列化我们使用:
pickle.dump(obj, file)

obj 就是要被序列化的对象,file 指的是存储的文件

pickle.load(file) 从file 读取数据,反序列化成对象

【操作】将对象序列化到文件中

import pickle
with 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 pickle
with 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 csv
with 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,王一,18
1002,王二,3
1003,王三,4

10. os 和os.path 模块

os 模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等。

10.1 os 模块-调用操作系统命令

  1. os.system 可以帮助我们直接调用系统的命令

【示例】os.system 调用windows 系统的记事本程序

import os
os.system("notepad.exe")
  1. os.startfile:直接调用可执行文件

【示例】运行安装好的微信

import os
os.startfile(r"C:/Program Files (x86)/Tencent/WeChat/WeChat.exe")

10.2 os 模块-文件和目录操作

我们可以通过前面的文件对象实现对于文件内容的读写操作。如果还需要对文件和目录做其他操作,可以使用os 和os.path 模块。

os 模块下常用操作文件的方法
python学习笔记10 文件操作(IO 技术)
os 模块下关于目录操作的相关方法
python学习笔记10 文件操作(IO 技术)
【示例】os 模块:关于文件和目录的操作

import os
print(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 模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作
python学习笔记10 文件操作(IO 技术)

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

shutil 模块是python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做
文件和文件夹的压缩、解压缩操作。

【示例】实现文件的拷贝

import shutil
#copy 文件内容
shutil.copyfile("1.txt","1_copy.txt")

【示例】实现将文件夹所有内容压缩(使用shutil 模块)

import shutil
import zipfile
#将"电影/学习"文件夹下所有内容压缩到"音乐2"文件夹下生成movie.zip的格式
shutil.make_archive("音乐2/movie","zip","电影/学习")
#压缩:将指定的多个文件压缩到一个zip 文件
z = zipfile.ZipFile("a.zip","w")#生成新压缩包
z.write("1.txt")#写入压缩文件
z.close()

【示例】实现将压缩包解压缩到指定文件夹(使用shutil 模块)

shutil
import zipfile
#解压缩:
z = zipfile.ZipFile("a.zip","r")
z.extractall("d:/") #设置解压的地址
z.close()

12. 递归算法

【示例】使用递归算法遍历目录下所有文件

import os
allfile = []
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表示缩进

未经允许不得转载:作者:1531-王同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《python学习笔记10 文件操作(IO 技术)》 发布于2021-02-21

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录