目录
文本文件与二进制文件
文本文件
存储普通“字符”文本,能用记事本打开,默认为 Unicode 字符集。
两个字节表示一个符号。最多表示 65536 个。
二进制文件
内容通过“字节”存储,不能用记事本正常打开。
常见的有:MP4,JPG,MP3,doc
创建文本对象
字符串前面加 r 的意图
a = 'aaa\nasdasdad'
b = r'aaa\nasdasdad'
c = 'aaa\\nasdasdad'
print(a)
print("###############")
print(b)
print("###############")
print(c)
###############################################
aaa
asdasdad
###############
aaa\nasdasdad
###############
aaa\nasdasdad
###############################################
使特殊字符表现为正常字符,如我们需要 \n 而不是换行符,只需要加 r 或 R,但是要紧贴引号
也可以 \\n 表示普通字符 \n
在打开文件的时候也是如此,文件路径可能会被误以为是特殊字符
open()
f1 = open(r"C:\Users\Lu\Desktop\homework.txt", "r")
f2 = open(r"C:\Users\Lu\Desktop\homework.docx", "br")
f1.close()
f2.close()
open( "文件路径, 要有后缀", "模式", "缓存" )
查询:传送门
文本文件的读写
基本操作
f = open(r'b.txt', "a") # a 追加模式,有这个文件指针指向结尾,没有则创建文件
f.write(r"leoluxx......") # 在 venv 下创建了新的文件为 a , 内容如括号所示
f.close() # 要记得关闭,不然会浪费资源
编码知识
1. ASCII 使用7位,能表示 2^7,128个字符,一字节的最高位总是0
2. ISO8859-1 兼容 ASCII ,使用8位,表示256个字符
3. GB2312 GBK GB18030 兼容 ISO8859-1,能表示汉字
4. Unicode 统一两个字节表示一个字符
5. UTF-8 兼容 ISO8859-1,可以看做是Unicode的实现
编码解码要一致,否则会有乱码
windows 默认 GBK,Linux 默认 UTF-8
python 默认 Unicode
在 windows 上操作文件,系统使用 GBK 编码,所以解码也需要使用 GBK
# write 写入字符串,writelines 写入字符串列表
f = open(r'a.txt', "a", encoding="UTF-8")
f.write('爱我中华')
f.writelines(["爱\n", "我\n", "中\n", "华\n"])
f.close()
# encoding 告诉操作系统建一个以 UTF-8 编码的文件,这样中文文件打开就不会有乱码
# 如果没有,打开文件后乱码,需要改变 file encoding 就可以正常显示
# 文件内表现形式
#################################################
爱我中华爱
我
中
华
#################################################
close() 关闭文件
# 使用异常机制,解决写入过程中发生错误,导致文件无法关闭的情况
# 异常机制,跳过错误,完成写操作
try:
f = open(r"a.txt", "a")
str = "dada"
f.write(str)
except BaseException as e:
print(e)
finally:
f.close()
with 上下文管理器
a = 'asdasd'
with open(r'a.txt', "a") as f:
f.write(a)
不用特地去关闭文件
文件的读取
读取方式
# 文件名.读取方式
with open(r"a.txt", "r", encoding="UTF-8") as f:
a = f.read() # 读取所有内容
with open(r"a.txt", "r", encoding="UTF-8") as f:
b = f.read(3) # 读取前三个字符
with open(r"a.txt", "r", encoding="UTF-8") as f:
c = f.readline() # 读取第一行
# 如果读取到文件末尾,会返回一个空字符串,按行读取会用到
with open(r"a.txt", "r", encoding="UTF-8") as f:
d = f.readlines() # 每一行作为字符串存入列表
按行读取(两种)
# 第一种
with open(r"a.txt", "r", encoding="UTF-8") as f:
while True:
fragment = f.readline()
if not fragment:
break
else:
print(fragment, end="")
# 第二种
with open(r"a.txt", "r", encoding="UTF-8") as f:
for a in f:
print(a, end="")
enumerate() 的使用
a = ["001", "002", "003"]
b = enumerate(a)
c = list(b)
print(c)
d = [temp + '#' + str(index) + "\n" for index, temp in c]
print(d)
################################################################
[(0, '001'), (1, '002'), (2, '003')]
['001#0\n', '002#1\n', '003#2\n']
################################################################
二进制文件的读写
要在模式中增加 b
注意:打开二进制文件不能添加编码,即不能加 encoding = "...",否则报错
拷贝
with open(r"a.gif", "rb") as f:
with open(r"aa.gif", "wb") as w:
for line in f.readlines():
w.write(line)
print("copy done")
文件基本操作
seek
用来控制当前指针位置,seek是按字节读取的,汉字一般3个字节
with open(r"a.txt", "r", encoding="utf-8") as f:
print("文件名是:{0}".format(f.name))
print("读取前指针位置:{0}".format(f.tell()))
print("文本内容:{0}".format(f.read()))
print("读取后指针位置:{0}".format(f.tell()))
f.seek(12, 0)
print("移动后指针位置:{0}".format(f.tell()))
print(f.read())
########################################################
文件名是:a.txt
读取前指针位置:0
文本内容:爱我中华爱我家
读取后指针位置:21
移动后指针位置:12
爱我家
########################################################
seek( 偏移量 [, 起始位置] )
偏移量:偏移量为正数,代表从起始位置向文件末尾偏移;偏移量为负数,代表从起始位置向文件起点偏移
起始位置: 0 代表从头开始(可以省略不写!)
1 代表从当前位置开始
2 从文件末尾开始
注意:在文本文件中,没有使用 b 模式选项打开的文件,只允许从文件头开始计算相对位置,从其他两个位置都会报错
只有使用 b 模式打开才可以让起始位置在当前或文件末尾,也就是只能用 0
序列化与反序列化
内存中的数据存入硬盘,称为序列化
从硬盘中取出读入内存,称为反序列化
网络中传播也可以这么理解
import pickle # 导入模块
a1 = "Lu"
a2 = 111
a3 = [1, 2, 3]
with open("a.txt", "wb") as f:
pickle.dump(a1, f) # 序列化
pickle.dump(a2, f)
pickle.dump(a3, f)
with open("a.txt", "rb") as f:
b1 = pickle.load(f) # 反序列化
b2 = pickle.load(f)
b3 = pickle.load(f)
print(b1)
print(b2)
print(b3)
print(id(a1)) # 内容一致,但是不是同一个对象了
print(id(b1))
###############################################
Lu
111
[1, 2, 3]
9871232
10022176
###############################################
CSV文件操作
CSV使逗号分隔符文本格式
值没有类型,都是字符串;不能指定字体样式;不能指定单元格宽高与合并;没有多个工作表;不能嵌入图像图表
读取和写入
import csv
with open(r"a.csv", "r") as f: # 第一种遍历方式
a_csv = csv.reader(f)
for row in a_csv:
print(row)
with open(r"a.csv", "r") as f: # 第二种
a_csv = csv.reader(f)
print(list(a_csv))
####################################
['姓名', '年龄', '城市']
['aaa', '16', 'A']
['bbb', '17', 'B']
['ccc', '18', 'C']
[['姓名', '年龄', '城市'], ['aaa', '16', 'A'], ['bbb', '17', 'B'], ['ccc', '18', 'C']]
####################################
import csv
with open(r"a.csv", "w") as f:
a_csv = csv.writer(f)
a_csv.writerow(['ddd', '19', 'D'])
b = [['eee', '20', 'E'], ['fff', '21', 'F'], ['ggg', '22', 'G']]
a_csv.writerows(b)
OS模块
调用操作系统可执行文件
import os
os.system("notepad.exe") # 记事本
os.system("regedit") # 注册表
os.system("ping www.baidu.com") # 查看网络交互状态
os.system("cmd") # 命令行
os.startfile(r"a.exe") # 调用可执行文件
文件和目录操作
import os
#########获取文件与文件夹信息
print(os.name) # 操作系统名称
print(os.sep)
print(repr(os.linesep))
print(os.stat("test3.py")) # 文件信息
#########关于工作目录操作
print(os.getcwd()) # 当前工作目录
os.mkdir("aaa") # 在工作目录下穿件新的目录
os.chdir("d:") # 改变工作目录至D盘
#########创建目录,创建多级目录,删除
os.rmdir("dadas") # 删除目录
os.makedirs("dad/dasd/das") # 创建多级目录
os.removedirs("dad/dasd/das") # 删除多级目录
os.makedirs("../ada/dad/ada") # 在上级目录下新建多级目录
os.rename("aaa", "bbb") # 把aaa改名为bbb
os.listdir("aaa") # 返回aaa目录下的一级子目录
os.path模块
使用说明:传送门
walk
遍历子目录子文键,返回一个三个元素的元组,路径,所有的目录,所有的文件
import os
all_files = []
path = os.getcwd()
list_files = os.walk(path)
for dirpath, dirnames, filenames in list_files:
for dir in dirnames:
all_files.append(os.path.join(dirpath, dir))
for file in filenames:
all_files.append(os.path.join(dirpath, file))
for file in all_files:
print(file)
shutil 模块(拷贝与压缩)
import shutil
import zipfile
# copy
shutil.copyfile("source.txt", "goal.txt")
shutil.copytree("aa/dd", "cc")
# 压缩、解压缩
shutil.make_archive("bb/cc", "zip", "aa") # 把 aa 这个文件压缩到 bb 下命名为 cc
z1 = zipfile.ZipFile("a.zip", "w")
z1.write("aa.txt")
z1.write("bb.txt")
z1.close()
z2 = zipfile.ZipFile("a.zip", "r")
z2.extractall("aaa")
z2.close()