1、文件的读写

1)文件的打开
  ① 格式

1
2
with open("文件路径","打开模式", encoding = "操作文件的字符编码") as f:
对文件进行操作的代码块

  ② 例子

1
2
3
with open("E:\ipython\测试文件.txt","r", encoding = "gbk") as f:	# 第一步:打开文件
text = f.read() # 第二步:读取文件
print(text)

  ③ 打开模式
|模式字母| 模式作用 |
|–|–|
| r | 只读模式。缺省模式。如果文件不存在,报错 |
|w| 覆盖写模式。如果文件不存在则创建;如果文件存在则完全覆盖原文件|
|x|创建写模式。如果文件不存在则创建;如果文件存在则报错|
|a|追加写模式。如果文件不存在则创建;如果文件存在则在原文件后追加|
|b|二进制文件模式。不能单独使用,要配合上面几个。该模式不需要指定encoding。|
|t|文本文件模式。不能单独使用,要配合上面几个。|
  ④ 字符编码
|编码类型| 编码特点 |
|–|–|
| 万国码 utf-8 | 包含全世界所有国家要用到的字符,也是python3的默认文件编码
|统一编码 Unicode|python3中字符串默认的编码方式|
|中文编码 gbk| 缺省编码,专门解决中文编码的问题|

关于字符编码详细的内容可以参考这篇文章,这里对必要内容做点记录
python3中,对字符串的编码使用的是Unicode的编码方式,但是整个源文件存储的时候采用的是utf-8的形式
当我们要打开一个源文件程序时,系统将源文件的utf-8编码的内容,先用utf-8的方式解码成二进制,再用Unicode编码的方式编码,然后才能显示在屏幕上。
这里要注意,我们用Windows10的记事本写东西默认是utf-8的方式编码存储,但Windows7默认的是ANSI的方式

2)文件的读取
  ① 读取整个内容——f.read()

1
2
3
with open("E:\ipython\测试文件.txt","r", encoding = "utf-8") as f:	# 第一步:打开文件
text = f.read() # 第二步:读取文件
print(text)

  ② 逐行读取——f.readline()

1
2
3
4
5
6
7
with open("E:\ipython\测试文件.txt","r", encoding = "utf-8") as f:	# 第一步:打开文件
while True
text = f.readline() # 第二步:读取文件,每次读取一行
if not text:
break
else:
print(text,end="")

  ③ 逐行读取,每行形成一个列表——f.readlines()

1
2
3
with open("E:\ipython\测试文件.txt","r", encoding = "utf-8") as f:	# 第一步:打开文件
text = f.readlines() # 第二步:读取文件
print(text)

3)文件的写入
  ① 向文件中写入字符串或字节流——f.write()
  要注意打开文件时的打开模式,是w还是a

1
2
with open("E:\ipython\测试文件.txt","w", encoding = "utf-8") as f:	# 第一步:打开文件
text = f.write("奥力给!\n") # 第二步:写入文件

  ② 将元素为字符串的列表写入——f.writelines()

1
2
3
ls = ["遇到困难不要害怕\n","勇敢的面对他\n","奥里给!\n"]
with open("E:\ipython\测试文件.txt","w", encoding = "utf-8") as f: # 第一步:打开文件
text = f.writelines(ls) # 第二步:写入文件

4)既读既写——最常用的方式
  ① f.seek(a,b)函数
    这个函数的作用的是将指针移到指定的地方。可以理解为平时打字时候的光标。
    函数的两个参数分别是:
    a:偏移字节数
    b:位置。可以是0,开始位置;1,当前位置;2,结尾位置
    比如:f.seek(2,0)的意思就是将指针移到开始位置后2个字节的地方。
  ② r+模式
    如果文件不存在,则报错
    指针一开始指向开始的地方
    要把指针移到最后才能开始写,否则会覆盖前面的内容

1
2
3
4
5
6
with open("E:\ipython\测试文件.txt","r+", encoding = "utf-8") as f:	# 第一步:打开文件
for line in f:
print(line) # 全部读一遍之后,指针指向结尾
f.seek(0,2) # 将指针指向开头后两个字节处
text = ["奥里给!\n","第二遍\n"]
f.writelines(text)

  ③ w+模式
    如果文件不存在,则创建
    如果文件存在,则会立刻清空原内容
  ④ a+模式
    如果文件不存在,则创建
    指针在末尾,添加新内容不会清空原内容
    最常用这个

2、模块

1)模块、包、库的区别
    模块:就是.py文件,里面定义了一些函数和变量。当我们在另一个.py文件中想使用前一个文件中的函数或变量时,我们就是从模块中调用。当然我们也可以自己写模块。
    包:是模块的上级概念。简单来说,就是“包”包含了许多模块和子包。包目录下的第一个文件便是init.py,然后是一些模块文件和子目录。例如子目录中也有init.py这个文件,那么它就是这个包的子包了。当然,当我们自己写好模块之后,也可以自己创建自己的包。实际上,想numpy等都是以包的形式发布的。
        在这里插入图片描述
    库:是具有相关功能模块的集合。他和包有重合部分,但不是包的上级概念。实际上并不做特别的区分。
2)自己写一个模块
    前面说到,一个模块其实就是我们平时写的东西。
    不同的是,为了模块更好的在其他文件中调用,需要在代码加上下面这行,并把不想调用时就运行的代码放入下面这句的代码块中:
    if __name__=='__main__':
    具体的解释可以参考这篇文章,解释的很清楚。
3)模块的导入
  ① 导入整个模块——import 模块名

1
2
3
4
import time # 导入整个模块

start = time.time() # 调用time模块中的time()方法
time.sleep(3) # 调用time模块中的sleep()方式

  ② 从模块中导入类或函数——from 模块 import 类名或函数名

1
2
3
4
from itertools import product
from function import fun1, fun2 # 一次导入多个函数
ls = list(product("AB","123"))
print(ls)

  ③ 导入模块中所有的类和函数——from 模块 import *

1
2
3
4
from random import *
# 这种方式可以直接使用函数名或类名,第一种方式要 模块名.函数名 这样子调用
print(randint(1,100)
print(random())

4)模块的查找路径
    模块的查找顺序是:内存 → 内置模块 → sys.path中