文件和目录访问
文件
文件是数据的抽象和集合
- 文件是存储在辅助存储器上的数据序列
- 文件是数据存储的一种形式
- 文件展现形态:文本文件和二进制文件
文本文件 vs. 二进制文件
- 文件文件和二进制文件只是文件的展示方式
- 本质上,所有文件都是二进制形式存储
- 形式上,所有文件采用两种方式展示
文本文件
- 由单一特定编码组成的文件,如UTF-8编码
- 由于存在编码,也被看成是存储着的长字符串
- 适用于例如:.txt文件、.py文件等
二进制文件
- 直接由比特0和1组成,没有统一字符编码
- 一般存在二进制0和1的组织结构,即文件格式
- 适用于例如:.png文件、.avi文件等
基本使用
文件打开和关闭
基本使用
1 | <变量名> = open(<文件名>, <打开模式>, encoding='utf-8') |
打开模式
文件的打开模式 | 描述 |
---|---|
‘r’ | 只读模式,默认值,如果文件不存在,返回FileNotFoundError |
‘w’ | 覆盖写模式,文件不存在则创建,存在则完全覆盖 |
‘x’ | 创建写模式,文件不存在则创建,存在则返回FileExistsError |
‘a’ | 追加写模式,文件不存在则创建,存在则在文件最后追加内容 |
‘b’ | 二进制文件模式 |
‘t’ | 文本文件模式,默认值 |
‘+’ | 与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
示例
1 | a = open("f.txt", "rt") |
文件内容的读取
1 | # 读入全部内容,如果给出参数,读入前size长度 |
数据的文件写入
1 | # 1)将嵌套列表或字典转为json格式数据 |
File对象的属性
属性 | 描述 |
---|---|
file.closed | 返回true如果文件已被关闭,否则返回false。 |
file.mode | 返回被打开文件的访问模式。 |
file.name | 返回文件的名称。 |
file.softspace | 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。 |
高阶使用
临时文件和目录
当我们在做数据分析的时候,可能会由于数据量过大导致内存不足。如果我们没有条件使用更高配置的电脑,也没有办法优化数据,那么我们可以先把计算的中间值存放在一个文本文件中。 这种方案虽然有效,但是中间数据写成的临时文件如果不清理,时间一长就会占用大量硬盘空间。当然你也可以每一次都覆盖临时文件,这样它虽然不会堆积,但当你的分析程序已经停止的时候,临时文件还在硬盘上占用空间。
tempfile 模块专门用于创建临时文件和临时目录
既可以在 UNIX 平台上运行良好,也可以在 Windows 平台上运行良好
入门示例
1
2
3
4
5
6
7
8
9
10
11
12 from tempfile import TemporaryFilewith TemporaryFile('w+t', encoding='utf-8') as f:
# 生成中间数据
f.write('中间数据')
f.write('另一部分中间数据')
# 其他计算过程
# 下面开始读取临时文件
f.seek(0)
f.read()
# 退出with上下文,临时文件自动被删除由于临时文件被关闭就会被删除,所以需要实现同时读写文件,因此文件模式为
w+t
使用
TemporaryFile
,你没法知道这个临时文件叫做什么名字。如果你想知道文件名,甚至想让另一个程序打开这个临时文件,那么你可以使用
NamedTemporaryFile
:
1
2
3
4
5
6
7 import redisfrom tempfile
import NamedTemporaryFile
with NamedTemporaryFile('w+t') as f:
# 把文件名通过某种方式传给其他程序
client = redis.Redis()
client.set('temp_file', f.name)
# 后续操作只要这个临时文件还没有被关闭,那么另一个程序就可以读取这个临时文件
1
2
3 ># 通过with语句创建临时目录
with tempfile.TemporaryDirectory() as tmpdirname:
print('创建临时目录', tmpdirname)
常用的函数
tempfile 模块函数 | 功能描述 |
---|---|
tempfile.TemporaryFile(mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None) | 创建临时文件。返回一个类文件对象,也就是支持文件 I/O |
tempfile.NamedTemporaryFile(mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True) | 创建临时文件。功能与上一个函数的功能大致相同,只是它生成的临时文件在文件系统中有文件名 |
tempfile.SpooledTemporaryFile(max_size=0, mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None) | 创建临时文件。与 TemporaryFile 函数相比,当程序向该临时文件输出数据时,会先输出到内存中,直到超过 max_size 才会真正输出到物理磁盘中。 |
tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None) | 生成临时目录 |
tempfile.gettempdir() | 获取系统的临时目录 |
tempfile.gettempdirb() | 与 gettempdir() 相同,只是该函数返回字节串 |
tempfile.gettempprefix() | 返回用于生成临时文件的前缀名 |
tempfile.gettempprefixb() | 与 gettempprefix() 相同,只是该函数返回字节串 |
提示:表中有些函数包含很多参数,但这些参数都具有自己的默认值
因此如果没有特殊要求,可以不对其传参
tempfile 模块还提供了 tempfile.mkstemp()
和 tempfile.mkdtemp()
两个低级别的函数
上面介绍的 4 个用于创建临时文件和临时目录的函数都是高级别的函数,高级别的函数支持自动清理,而且可以与 with 语句一起使用
而这两个低级别的函数则不支持,因此一般推荐使用高级别的函数来创建临时文件和临时目录
此外,tempfile 模块还提供了 tempfile.tempdir
属性,通过对该属性赋值可以改变系统的临时目录
数据解压缩
gzip 格式
读取压缩文件示例:
1 | import gzip |
创建GZIP 文件示例:
1 | import gzip |
使用 GZIP 压缩已有的文件示例:
1 | import gzip |
使用 GZIP 压缩二进制字符串示例:
1 | import gzip |
ZIP格式
tar格式
如何将整个 tar 归档提取到当前工作目录:
1 | import tarfile |
如何通过
TarFile.extractall()
使用生成器函数而非列表来提取一个 tar 归档的子集:
1 | import os |
如何基于一个文件名列表创建未压缩的 tar 归档:
1 | import tarfile |
使用
with
语句的同一个示例:
1 | import tarfile |
如何读取一个 gzip 压缩的 tar 归档并显示一些成员信息:
1 | import tarfile |
如何创建一个归档并使用
TarFile.add()
中的 filter 形参来重置用户信息:
1 | import tarfile |
os库
基本概念
os库提供通用的、基本的操作系统交互功能,是Python标准库
包含几百个函数,常用路径操作、进程管理、环境参数等几类
路径操作:os.path子库,处理文件路径及信息
进程管理:启动系统中其他程序
环境参数:获得系统软硬件信息等环境参数
path子库
导入
1 | from os.path import join |
文件操作
判断是否是文件 filepath最后没有/ 默认取//
1 | filepath = '../res/file_op/folder/' |
判断两个路径都指向相同的文件或目录
1 | # 如果两个路径都指向相同的文件或目录,则返回 True |
增删文件[夹]
创建文件夹
1 | # 2. 创建、删除文件与文件夹 |
删除文件夹
1 | os.rmdir(newfolder) # 如果要删除目录,请使用rmdir(). |
删除文件
1 | if os.path.exists(join(filepath,'file_0.txt')): |
目录遍历
列出目录下的所有子目录
1 | path = '../res/file_op' |
列出目录下的所有文件
1 | for dirpath, dirnames, filenames in os.walk(path): |
分割文件目录/文件名和后缀
1 | file_path = "D:/test/test.py" |
目录操作
修改目录名称
1 | os.rename('d0/d10/d100', 'D100') # 会导致目录移动! |
返回当前程序与文件之间的相对路径 (relative path)
1 | path = 'E:\\PycharmWS\\sj\\text-mining-framework' |
返回 path 的大小,以字节为单位,该文件不存在或不可访问时,抛出 OSError 异常
1 | os.path.getsize( "D:/PYE/file.txt" ) # 返回path对应文件的大小,以字节为单位 |
返回序列 paths 中每个路径名称的最长共同有效子路径
1 | # 如果 paths 同时包含绝对和相对路径名称或者如果 paths 为空则会引发 ValueError |
高阶文件操作
复制和删除
复制文件[夹]
1 | import shutil |
移动文件[夹]
1 | # shutil.move(srcfile, dstfile) : 移动srcfile文件并命名为dstfile,相当于文件重命名 |
返回路径和最后一个文件名组成的元组
1 | # 返回路径和最后一个文件名组成的元组 |
磁盘使用统计
磁盘使用统计数据,形式为一个 named tuple,其中包含 total, used 和 free 属性
分别表示总计、已使用和未使用空间的字节数。
在 Windows 上,path 必须是一个目录;在 Unix 上,它可以是一个文件或一个目录
1 | import shutil |
os库之环境参数
获取或改变系统环境信息
1 | # 修改当前程序操作的路径 |
获取操作系统环境信息
1 | # 获得当前系统登录用户名称 |
获取操作系统环境信息
1 | # 获得n个字节长度的随机字符串,通常用于加解密运算 |
其他使用
os库之进程管理
1 | # 执行程序或命令command |
查看剩余空间大小(ubuntu)
1 | def checkDis(path): |