13文件操作
13.1 文件的概念
13.1.1 文件的概念和作用
计算机的文件,就是存储在某种长期储存设备上的一段数据
长期存储设备包括:硬盘、U 盘、移动硬盘、光盘...
文件的作用:将数据长期保存下来,在需要的时候使用
13.1.2 文件的存储方式
在计算机中,文件是以二进制的方式保存在磁盘上的
文本文件和二进制文件:
1)文本文件
可以使用 文本编辑软件 查看
本质上还是二进制文件
例如:python 的源程序
2)二进制文件
保存的内容不是给人直接阅读的,而是提供给其他软件使用的
例如:图片文件、音频文件、视频文件等等
二进制文件不能使用文本编辑软件查看
13.2 文件的基本操作
13.2.1 操作文件的套路
在计算机中要操作文件的套路非常固定,一共包含三个步骤:
1)打开文件
2)读、写文件
读:将文件内容读入内存
写:将内存内容写入文件
3)关闭文件
13.2.2 操作文件的函数/方法
在Python中要操作文件需要记住1个函数和3个方法:
open函数负责打开文件,并且返回文件对象
read/write/close三个方法都需要通过文件对象来调用
13.2.3 打开文件的方式
open函数默认以只读方式打开文件,并且返回文件对象
语法如下:
python f = open("文件名", "访问方式")
注:不同模式可以组合使用,例如:“wb”、“rb”、“w+”、“r+”等
提示:频繁的移动文件指针,会影响文件的读写效率,开发中更多的时候会以只读(r)、只写(w、a)的方式来操作文件。
写入文件示例:
13.2.4 读取文件read方法
1)open函数的第一个参数是要打开的文件名(文件名区分大小写)
如果文件存在,返回文件操作对象
如果文件不存在,会抛出异常
2)read方法可以一次性读入并返回文件的所有内容
3)close方法负责关闭文件
如果忘记关闭文件,会造成系统资源消耗,而且会影响到后续对文件的访问
注意:read方法执行后,会把文件指针移动到文件的末尾
13.2.4.1. 读取文件read
read(n):读取n个字符。n不填时,默认读取所有内容,
13.2.4.2. 单行读取readline
读取大文件的正确姿势
13.2.4.3. 迭代遍历
13.2.4.4. 多行读取readline(很少使用)
提示:在开发中,通常会先编写打开和关闭的代码,再编写中间针对文件的读/写操作!防止忘记关闭文件
13.2.4.5. 文件指针(知道)
文件指针标记从哪个位置开始读取数据
第一次打开文件时,通常文件指针会指向文件的开始位置。当执行了read方法后,默认情况下文件指针会移动到读取内容的末尾。
思考
如果执行了一次read方法,读取了所有内容,那么再次调用read方法,还能够获得到内容吗?
答案:不能
第一次读取之后,文件指针移动到了文件末尾,再次调用不会读取到任何的内容
13.2.4.6. 练习:将文件内容保存到列表
要求:将每种水果的作为一个字典,添加到列表中
文件内容:
代码:
表格内容增加或水果种类增加,程序都有很好的兼容性
执行结果:
修改水果文件,增加行和列:
依旧可以正常输出:
13.2.5 写文件write方法
13.2.5.1. w只写模式
使用w(只写)模式打开文件。如果文件存在,会被覆盖。如果文件不存在,创建新文件
1)新建文件
2)写入文件
13.2.5.2. a追加模式
使用a(追加)模式打开文件。如果该文件已经存在,文件指针定位到文件结尾,如果文件不存在,创建新文件
程序运行2遍后,写入效果:
13.2.6 b二进制模式打开文件
需求将c盘的图片,复制到d盘
13.2.7 “+”扩展操作(了解)
通常在开发中更多的时候会以只读(r)、只写(w、a)的方式来操作文件。
13.2.8 文件读写案例—复制文件
目标:用代码的方式,来实现文件复制过程
1)小文件复制
打开一个已有文件,读取完整内容,并写入到另外一个文件
2)大文件复制
打开一个已有文件,逐行读取内容,并顺序写入到另外一个文件
13.2.9 文件读写案例—修改文件
需求:将文件中的“一”,替换为“壹”
文件:
代码:
执行结果:
13.2.10 with语句:自动关闭文件
进入with语句时,执行打开文件。离开with语句时,执行关闭文件。
使用with语句,就不用close关闭文件了。
13.3 文件/目录操作 os
在终端/文件浏览器、中可以执行常规的文件/目录管理操作,例如:
创建、重命名、删除、改变路径、查看目录内容、……
在Python中,如果希望通过程序实现上述功能,需要导入os模块
13.3.1 文件操作
13.3.2 目录操作
提示:文件或者目录操作都支持相对路径和绝对路径
13.4 文本文件的编码格式(科普)
文本文件存储的内容是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等
Python 2.x默认使用ASCII编码格式
Python 3.x默认使用UTF-8编码格式
13.4.1 ASCII编码和UNICODE编码
1)ASCII编码
计算机中只有128个ASCII字符,共用7个bit,为了便于存储,使用1byte(8bit),第一位用0补齐。所有编码都兼容ASCII码
2)GBK国标码
16bit 2byte 中文
3)Unicode万国码
32bit 4byte支持各国语言,但也最消耗空间
Unicode是一本很厚的字典,她将全世界所有的字符定义在一个集合里。这么多的字符不是一次性定义的,而是分区定义。每个区可以存放65536个(216)字符,称为一个平面(plane)。目前,一共有17个(25)平面,也就是说,整个Unicode字符集的大小现在是2^21。
4)UTF-8编码格式
UTF-8是可变长度的UNICODE编码,最短长度8bit。为了节省空间,可以去掉UNICODE编码中最前面的若干个0。UTF-8适合网络传输和存储。
英文utf-8:8bit 1byte和ascii一样
欧洲utf-8:16bit 2byte
中文utf-8:24bit 3byte
5)ascii编码与字母相互转换ord、chr。参考:字符串ord和chr
13.4.2 Python 2.x中如何使用中文
Python 2.x 默认使用ASCII编码格式,Python 3.x默认使用UTF-8编码格式
在Python 2.x文件的第一行增加以下代码,解释器会以utf-8编码来处理python文件
- coding:utf8 -
这方式是官方推荐使用的!
也可以使用:
coding=utf8
unicode字符串
在Python 2.x中,即使指定了文件使用UTF-8的编码格式,但是在遍历字符串时,仍然会以字节为单位遍历字符串
要能够正确的遍历字符串,在定义字符串时,需要在字符串的引号前,增加一个小写字母u,告诉解释器这是一个unicode字符串(使用UTF-8编码格式的字符串)
在字符串前,增加一个u表示这个字符串是一个utf8字符串
13.4.3 编码和解码
1)编码encode
输出结果是字节(byte),utf-8中使用三个字节表示一个汉字,表示“胡辣汤”需要使用9个字节。
2)解码decode
输出结果是字符串
注意:用什么编码方式编码,还用什么编码方式解码。否则会报错
3)英文字母编码后不变
utf-8是可变长度的unicode编码,英文字母使用utf-8编码后与ascii码一样,打印出来还是英文字母
13.5 logging日志文件
通过log的分析,可以方便用户了解系统或软件、应用的运行情况。可以及时发现问题并快速定位、解决问题,补救损失。
1)单日志文件
2)多日志文件:
执行结果:l1.log和l2.log
13.6 shutil文件和目录操作
`import shutil
拷贝文件
shutil.copy2('原文件', '现文件')
shutil.copy2('file', 'temp')
拷贝目录
shutil.copytree("原目录", "新目录", ignore=shutil.ignore_patterns("*.pyc"))
shutil.copytree("/Users/jingliyang/PycharmProjects/面试题/常用模块/logging模块", "logging模块2", ignore=shutil.ignore_patterns("init.py"))
删除目录
shutil.rmtree("temp", ignore_errors=True)
shutil.rmtree("logging模块2", ignore_errors=True)
移动文件/目录
shutil.move("logging模块", "logging2", copy_function=shutil.copy2)
获取磁盘使用空间
total, used, free = shutil.disk_usage(".")
print("当前磁盘共: %iGB, 已使用: %iGB, 剩余: %iGB"%(total / 1073741824, used / 1073741824, free / 1073741824))
压缩文件
shutil.make_archive('压缩文件夹的名字', 'zip','待压缩的文件夹路径')
shutil.make_archive('logging2', 'zip','/Users/jingliyang/PycharmProjects/面试题/常用模块/随机数')
解压文件
shutil.unpack_archive('zip文件的路径.zip','解压到目的文件夹路径')
shutil.unpack_archive('/Users/jingliyang/PycharmProjects/面试题/常用模块/shutil模块/logging2.zip','/Users/jingliyang/PycharmProjects/面试题/常用模块/shutil模块/tmp')`