0%

文件及模块操作

python的第七节课笔记(基础提升)

我们之前编写代码都是用变量接收存储数据,但是变量是存在于运行内存中的,程序结束变量就被释放掉了。现在要想把程序运行的结果永久保存下来该怎么办呢?于是我们要把数据保存到文件之中。

文件操作总览:

文件操作:

文件的打开:

1
2
相对路径: 相对于当前位置而言,要找到目标文件所进过的路程
绝对路径: 从根目录(盘符)触发,要找到目标文件所进过的路程
open()函数语法 f = open(文件路径, 操作模式, 编码方式)
文件路径 相对路径:test15
绝对路径:D:\LiuMupy\cls15\09文件与模块\test15.txt
复制绝对路径:右击文件名—>copy–> Absolute Path
编码方式 encoding=”utf-8” 指定编码方式
操作模式:
r 只读模式,不存在则报错,存在则打开
1
2
3
4
5
f = open("text.txt", mode="r", encoding="utf-8")
# data = f.read() # 读取并返回所有文件内容
# data = f.readline() # 读取并返回单行内容
data = f.readlines() # 去读多行并使用列表形式进行返回,换行使用\n表示
print(data)
w 只写模式 ,覆盖写入,不存在则新建,存在则打开
1
2
3
4
5
6
f = open("text.txt", "r")
f = open("text.txt", "w", encoding="utf-8")
f.write("小鲸鱼")
f.writelines(["子良\n", "常在", "老蒋"]) # 写入多条, 换行需要手动添加换行符\n
print(f.writable()) # 判断文件是否可写
print(f.readable()) # 判断文件是否可读
a 追加写入,写入方式与w一致,不会覆盖原来的数据
1
2
3
f = open("text.txt", "a", encoding="utf-8")
f.writelines(["子良\n", "常在", "老蒋"])
f.write("\n搞钱小秘书")
+模式在原来的模式上面添加新的 r 或者 w 功能

注意:

  • r+ 在读取的基础上增加写入
  • w+ 在写入的基础上增加读取 (覆盖写入)
  • a+ 在写入的基础上增加读取 (追加写入)
  • 谁在前面就以谁为主
1
2
3
4
f = open("text.txt", "r+")  # 先判断 r ,不存在,报错
f = open("text.txt", "w+") # 先判断 w ,不存在,新建
print(f.readable())
print(f.writable())
rb 读取图片,图片、音频、视频等在计算机中存储为二进制
1
2
f = open("5200.jpg", "rb")
print(f.read())

文件的读取:

data = f.read() 读取并返回所有文件内容
data = f.readline() 读取并返回单行内容
data = f.readlines() 去读多行并使用列表形式进行返回,换行使用\n表示

文件的写入:

f.write(“小鲸鱼”) 写入单条
f.writelines([“子良\n”, “常在”, “老蒋”]) 写入多条, 换行需要手动添加换行符\n

文件的关闭:

f.close() 关闭文件
f.flush() 刷新文件
1
2
3
4
#上下文管理器  操作完毕之后会自动关闭文件

with open(文件名,模式,编码方式) as 变量名:
变量名.方法()
1
2
with open("text.txt", "r", encoding='utf-8') as f:
print(f.readlines())
1
2
3
4
5
6
7
8
9
10
"""
光标(指针)
f.tell() 查看当前指针位置
f.read(10) 读取,读取的是字符个数
"""
f = open("text.txt", "a+", encoding='utf-8')
f.write("\n乖乖")
f.seek(0) # 调整光标到最前面
print(f.tell())
print(f.read(15)) # 指定从光标开始的位置开始读取指定个数

文件流 io:

作用:反复的写入和读取数据或损耗磁盘读写次数,也非常麻烦,文件流生成的是一个临时假文件,并不会占用磁盘空间
1
2
3
4
5
6
7
8
9
10
import io
str_io = io.StringIO() # 生成临时假文件(字符串)
str_io.write("宋志上")
str_io.seek(0) # 方式一:调整指针位到开始
print(str_io.read()) # 没有读取到数据-->写入之后,指针在最后,后面已经没有数据
print(str_io.getvalue()) # 不需要考虑指针,直接读取全部

bt_io = io.BytesIO() # 生成临时假文件(二进制)
bt_io.write(b"hello cls15") # b 模拟字符串里面的一个二进制的数据
print(bt_io.getvalue())

os 模块 :

操作文件和文件目录(文件夹):

注意:

  • 工作目录:这个文件在那个文件夹下面,这个文件夹的绝对路径就叫工作目录
  • 每个人的电脑文件是不一样的,工作目录也不一样
1
2
3
4
5
6
7
8
9
import os

print(os.getcwd()) # 打印当前的工作目录
#更换工作目录为 08函数文件夹下面
os.chdir(r"D:\LiuMupy\cls15\08函数")
print(os.getcwd())
print(os.listdir()) # 由于前面更换了工作目录所以现在查看到的是08函数里面的文件
#os.rename("旧", "新")
os.rename(r"test_new.py", r"D:\LiuMupy\test_new.py")

模块操作:

内置模块的导入:

语法 解释 调用
方式一: import 模块名 导入全部 模块名.方法名()
方式二: from 模块名 import 方法名 指定导入 方法名()
from 模块名 import * 导入全部 模块名.方法名()
方式三: from 模块名 import 方法名 as 别名 有时模块名字太长,可以起个别名导入 别名()
1
2
3
4
5
6
7
8
9
10
11
12
import Mode

Mode.fun1()
Mode.fun2()

from Mode import fun1
fun1()
# fun2() # 没有导入fun2,报错

from Mode import fun1 as f1
# fun1() # 已经取了别名,不能用原名调用
f1()

注意:

  • Mode是你自己建的py文件,里面的函数也是你写的

  • 要先创建Mode.py文件,你才能import Mode

  • 因为这个是你自建的模块,所以会有红线,消除红线的方法是,找到你运行代码的文件夹,右键点进”Mark Directory as”文件名,

    再点”Excluded“,红线就消失了

文件路径添加:

使用sys模块

sys.path 查看可以导入模块的路径,查看引用模块时候的搜索路径,如果这里面都没有这个模块—报错
sys.path.append(path) 添加其他的路径
1
2
3
4
5
6
7
8
9
10
11
12
import sys
# print(sys.path)

# 将自己的模块添加到路径表里面---> list.append()
# r 取消转移,保留字符串本身的含义
p = r"D:\LiuMupy\cls15\09文件与模块\Mode.py"
li = sys.path
li.append(p)
# print(li)

from Mode import fun1
fun1() # 可以对Mode里面的方法进行调用

导入第三方库:

注意:

  • 先下载(在cmd里面下载)
  • pip install 模块名 -i 国内源
查看已有的模块(库) pip list
卸载已有模块 pip uninstall 模块名

国内镜像源:

豆瓣 https://pypi.douban.com/simple/
阿里 https://mirrors.aliyun.com/pypi/simple/
华中理工大学 https://pypi.hustunique.com/simple/
山东理工大学 https://pypi.sdutlinux.org/simple/
中国科学技术大学 https://pypi.mirrors.ustc.edu.cn/simple/
清华 https://pypi.tuna.tsinghua.edu.cn/simple

主函数:

1
2
3
#主函数样式
if __name__ == '__main__':
print("这是我的主函数")

注意:

  • 一个文件的主函数:里面的代码只能被当前文件所执行