Python文件操作
文章目录
文件操作相关模块
名称 | 说明 |
---|---|
io 模块 | 文件流的输入和输出操作 input output |
os 模块 | 基本操作系统功能,包括文件操作 |
glob 模块 | 查找符合特定规则的文件路径名 |
fnmatch 模块 | 使用模式来匹配文件路径名 |
fileinput 模块 | 处理多个输入文件 |
filecmp 模块 | 用于文件的比较 |
cvs 模块 | 用于 csv 文件处理 |
pickle 和 cPickle | 用于序列化和反序列化 |
xml包 | 用于 XML 数据处理 |
bz2、gzip、zipfile、zlib、tarfile | 用于处理压缩和解压缩文件(分别对应不同的算法) |
sys.path
import sys
sys.path.append('my_model.py')
sys.path.insert(0, 'my_model.py')
sys.path
是python的搜索模块的路径集,是一个列表(list
)。
用sys.path.append(path)
可以在python环境下添加相关的路径
选择用sys.path.insert(0,…)
这样新添加的目录会优先于sys.path
中的其他目录被import
检查。
举个例子:
1.在F:\\
中有一个python文件(自己创建的模块)
文件内容为name = 'this is my model.'
2.我们在另一个地方新建我们主程序
文件内容为
import sys
import my_model
print(my_model.name)
运行结果
但是我们发现报错了,错误信息为ModuleNotFoundError: No module named 'my_model'
3.再让我们改一下主程序(在第2行增添sys.path.append('F:/')
)后运行
可以看到sys.path
原先在不包括F:/
时,我们的主程序是找不到my_model
这个模块,sys.path
是python的搜索模块的路径集。
同时明确了sys.path
是一个列表,那对sys.path
的操作便与对列表得操作一样(如:.insert()
)。
注意:以上方法在退出python环境后自己添加的路径就会自动消失!
os模块常用方法
os.getcwd() 方法用于返回当前工作目录。
os.chdir() 方法用于改变当前工作目录到指定的路径。
os.rename() 方法用于命名文件或目录,从 src 到 dst,如果dst是一个存在的目录, 将抛出OSError。
os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。
os.path.abspath(path) 返回绝对路径
os.path.basename(path) 返回文件名
更多详情参考:https://www.runoob.com/python3/python3-os-file-methods.html
文本文件操作
open()函数用于创建文件对象
基本语法格式如下:
open(文件名, [打开方式])
如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,比如:D:\a\b.txt
。
为了减少“\
”的输入,可以使用原始字符串:r“d:\a.txt”
。示例如下:
f = open(r"d:\a.txt", "w")
打开方式有如下几种:
模式 | 描述 |
---|---|
r | 读 read 模式 |
w | 写 write 模式。如果文件不存在则创建;如果文件存在,则重写新内容; |
a | 追加 append 模式。如果文件不存在则创建;如果文件存在,则在文件末尾追加内容 |
b | 二进制 binary 模式(可与其他模式组合使用) |
+ | 读、写模式(可与其他模式组合使用) |
文本文件对象和二进制文件对象的创建:
如果我们没有增加模式“b
”,则默认创建的是文本文件对象,处理的基本单元是“字符”。
如果是二进制模式“b
”,则创建的是二进制文件对象,处理的基本单元是“字节”。
f = open(r"a.txt","a") # 以追加模式打开文件
s = "hello world!\n I'm Python!\n"
f.write(s)
f.close()
write()/writelines()写入数据
write(a)
:把字符串 a 写入到文件中
writelines(b)
:把字符串列表写入文件中,不添加换行符
# 添加字符串列表数据到文件中
f = open(r"d:\bb.txt","w",encoding="utf-8")
s = ["abc\n", "def\n", "ghi\n"]
f.writelines(s)
f.close()
close()关闭文件流
由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用 close()方法
关闭文件对象。当调用 close()方法时,首先会把缓冲区数据写入文件(也可以直接调用 flush()
方法),再关闭文件,释放文件对象。
with 语句(上下文管理器)
with 关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出 with 块,都能
确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。
【操作】使用 with 管理文件写入操作
s = ["12a\n", "34b\n", "56c\n"]
with open(r"d:\bb.txt","w") as f:
f.writelines(s)
文本文件的读取
文件的读取一般使用如下三个方法:
read([size])
,从文件中读取 size 个字符,并作为结果返回。
如果没有 size 参数,则读取整个文件。 读取到文件末尾时,会返回空字符串。
# 读取一个文件前 4 个字符(read(4))
with open(r"bb.txt","r",encoding="utf-8") as f:
print(f.read(4))
# 文件较小,一次将文件内容读入到程序中(read(),不带参数)
with open(r"d:\bb.txt","r") as f:
print(f.read())
readline()
,读取一行内容作为结果返回。读取到文件末尾时,会返回空字符串。
# 按行读取一个文件(readline())
with open(r"bb.txt","r") as f:
while True:
fragment = f.readline()
if not fragment:
break
else:
print(fragment)
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)
作业
1.统计this.txt
文件中字母(‘a’-‘z’)、大写字母( ‘A’-‘Z’)、数字(0-9)、其他字符的个数。
附件:this.txt
2.实现类似DOS命令中的tree
命令功能
输入特定的路径,以该路径为起点,将其子目录打印到tree.txt
中