1 文件概述
持久化操作即文件操作
数据库底层操作仍然是文件IO
文本文件存储字符,可用记事本打开,默认使用Unicode字符集,使用两个字节表示一个字符
word文档不是文本文件
二进制文件数据使用字节存储
创建文件对象 - open()
# r读 w写 a追加 b二进制 +读写模式
# w如果不存在则创建,如果存在则重写
# 开头的r表示资源路径
f = open(r"d:\a.txt","a")
文本文件写入
# python->解释器->操作系统资源
f = open("a.txt","a")
s = "Vincent\n加油\n"
f.write(s)
# 文件操作处理完一定要关闭
f.close()
2 中文乱码问题解决
f = open("a.txt","a",encoding="utf-8")
f = open("a.txt","a")
s = "加油\nVincent\n"
f.write(s)
f.close()
utf-8于gbk\gb2312\gb18030不兼容
编码解码要一致
win默认编码是gbk,linux默认utf-8
python程序模式编码是unicode,写入操作系统时转换为gbk
pycharm使用gbk打开txt则汉字正常显示
3 关闭流要点
writelines()
把字符串列表写入文件,不添加换行符
关闭流
finally确保关闭流
try:
f = open(r"b.txt","a")
strs = ["Vincent","Wu","DFun"]
f.writelines(strs)
except BaseException as e:
print(e)
finally:
f.close()
调用close时会把缓冲区内容写入文件,再关闭文件
也可以直接调用flush
4 上下文管理器 - with
s = ["Vincent","Wu","DFUN"]
# 相当于创建一个还原点,执行完之后会还原资源
# 体会简洁
with open(r"d:\a.txt","w") as f:
f.writelines(s)
5 文本文件读取
三个方法
read(size) 读取size个字符,不传则读取整个文件
readline()
readlines()
with open(r'd:\a.txt','r',encoding='utf-8') as f:
str = f.read()
print(str)
按行读取
with open(r'd:\a.txt','r',encoding='utf-8') as f:
for a in f:
print(a,end="")
6 练习 - 每行添加行号
a = ["我爱你","Vincent","Wu"]
b = enumerate(a)
# 推导式 去除空白符
c = [temp.rstrip()+" #"+str(index) for index,tmp in enumerate(a)]
with open("a.txt","r",encoding="utf-8") as f:
lines = f.readline()
lines = [temp.rstrip()+" #"+str(index)+"\n" for index,tmp in enumerate(lines)]
with open("a.txt","w",encoding="utf-8") as f:
f.writelines(lines)
7 二进制文件读取 | 写入
图片文件拷贝
with open("d:/a.jpg","rb") as f:
with open("d:/a_copy.jpg","wb") as w:
for line in f.readlines():
w.write(line)
print("图片拷贝完成")
8 文件常用属性 | 方法
常用属性
name
mode
常用方法
flush()
缓冲区写入文件,不关闭文件
seek(offset [,whence])
文件指针移动到新的位置
whence 0头 1当前位置 2文件末尾
with open("D:/a.txt","w",encoding="utf-8") as f:
print('文件名是:{}'.format(f.name))
# 当前指针位置
print(f.tell())
print("读取的内容是:{}".format(f.readline()))
print(f.tell())
# 从第3个位置开始读
f.seek(3)
print("读取的内容是:{}".format(f.readline()))
9 序列号 - pickle
python一切皆对象,对象就是存储数据的内存块
内存数据->硬盘,即序列号
序列化即对象转成串行化数据
序列化后可以进行网络传输
扩展:
移植记忆,碳基 -> 硅基,成神
import pickle
# 序列化
with open(r"d:/a.txt","wb") as f:
a1 = "Vincent"
a2 = 123
a3 = [10,20,30]
pickle.dump(a1,f)
pickle.dump(a2,f)
pickle.dump(a3,f)
# 反序列化
with open(r"d:/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))
10 CSV文件的操作
CSV常用于与excel\数据库的导入导出
CSV文件:
姓名,年龄,工作,薪水
张三,18,程序员,50000
李四,19,设计师,10000
王五,20,前端,1000
import csv
with open("d:/a.csv","r") as f:
a_csv = csv.reader(f)
print(list(a_csv))
for row in a_csv:
print(row)
with open("d:/b.csv","w") as f:
b_csv = csv.writer(f)
b_csv.writerow(["ID","姓名","年龄"])
b_csv.writerow(["1","张三","18"])
b_csv.writerow(["2","李四","19"])
b_csv.writerow(["3","王五","20"])
# 写多行
b_csv.writerows([["4","赵六","21"],["5","田七","22"]])
11 os模块
对操作系统进行操作
可以调用系统常见命令
import os
# 调用记事本
os.system('notepad.exe')
# 调用ping命令
os.system('ping www.baidu.com')
# 调用注册表
os.system('regedit')
# 直接调用可执行文件
os.startfile(r'C:\sof\Tencent\WeChat\WeChat.exe')
解决控制台乱码:
setting->搜索encoding->改为gbk
12 os模块 - 操作文件 | 目录
操作文件方法
remove(path) 删除
rename(src,dest) 重命名
stat(path) 文件属性
listdir(path) 列出子目录子文件
操作目录方法
mkdir(path) 创建目录
mkdirs(path1/path2/path3) 递归创建多级目录
rmdir(path) 删除目录
removedirs(path1/path2) 递归删除多级目录
#coding=utf-8
import os
# 操作文件和目录
# 返回操作系统信息 windows->nt linux/unix->posix
print(os.name)
# 返回分隔符
print(os.sep)
# 返回换行符 win->\r\n linux->\n\
print(repr(os.linesep))
# 返回文件信息
print(os.stat('a_luanma.py'))
# 操作工作目录
# 当前工作目录
print(os.getcwd())
# 创建目录
# os.mkdir('书籍')
# 改变工作目录
# os.chdir('d:')
# 目录创建
# 相对路径,相对于当前工作目录
# os.mkdir('书籍')
# os.rmdir('书籍')
# ../ 表示上级目录
# os.makedirs('a/b/c')
# os.removedirs('a/b/c')
# os.rename('书籍','book')
dirs = os.listdir('../')
print(dirs)
不必纠结所有方法,先建立知识体系
13 os.path模块
常用方法
isabs(path) 是否绝对路径
isdir(path) 是否目录
isfile(path) 是否文件
exits(path) 是否存在
getsize(filename) 文件大小
abspath(path) 获取绝对路径
dirname(p) 获取目录路径
getatime(filename) 获取最后访问时间
#coding=utf-8
import os.path
print(os.path.isabs('d:/a.txt'))
print(os.path.isdir('d:/a.txt'))
print(os.path.isfile('d:/a.txt'))
print(os.path.exists('d:/a.txt'))
print(os.path.getsize('b.txt'))
print(os.path.abspath('b.txt'))
print(os.path.dirname('b.txt'))
print(os.path.getctime('b.txt'))
print(os.path.getatime('a.txt'))
path = os.path.abspath('b.txt')
# 切割为目录+文件
print(os.path.split(path))
# 切割为文件+扩展名
print(os.path.splitext(path))
# 路径连接
print(os.path.join('aa','bb','cc'))
练习 - 列出工作目录所有py文件
#coding=utf-8
# 列出工作目录所有py文件
import os
path = os.getcwd()
file_list = os.listdir(path)
for filename in file_list:
if filename.endswith('py'):
print(filename,end='\t')
file_list2 = [filename for filename in os.listdir(path) is filename.endswith('py')]
for f in file_list2:
print(f,end='\t')
14 os.path模块 - 使用walk遍历
返回三个元素元组
dirpath 路径
dirnames 目录名
filenames 文件名
# coding=utf-8
import os
path = os.getcwd()
list_files = os.walk(path)
for dirpath,dirnames,filenames in list_files:
# 目录
for dir in dirnames:
print(dir)
print(os.path.join(dirpath,dir))
print()
# 文件
for file in filenames:
print(file)
# 可以在循环外定义一个列表append
print(os.path.join(dirpath, file))
15 shutil模块
文件 | 文件夹的拷贝 | 解压缩
# coding=utf-8
import shutil
# 文件拷贝
shutil.copyfile('b.txt','b_copy.txt')
# 文件夹拷贝
shutil.copytree('a/b','b_copy')
# 忽略指定类型的文件
shutil.copytree('a/b','b_copy',ignore=shutil.ignore_patterns('*.txt','*.html'))
16 shutil压缩解压缩 | zip模块
# coding=utf-8
import shutil
import zipfile
# 压缩
shutil.make_archive('b_arc','zip','a/b')
# zip模块压缩
z1 = zipfile.ZipFile('a.zip','w')
z1.write('1.txt')
z1.write('a/b')
z1.close()
# zip模块解压缩
z2 = zipfile.ZipFile('a.zip','r')
z2.extractall('c')
z2.close()
17 递归打印目录树
递归算法原理 | 阶乘
自己调自己
递归比较耗资源
# 递归求阶乘
def factorial(n):
if n == 1:
return n
else:
return n*factorial(n-1)
print(factorial(5))
练习 - 递归打印目录树
#coding=utf-8
import os
def getAllFiles(path,level):
childFiles = os.listdir(path)
for file in childFiles:
filepath = os.path.join(path,file)
print('\t'*level + filepath)
if os.path.isdir(filepath):
getAllFiles(filepath,level+1)
getAllFiles('D:\oth',0)
18 模块
概念
量变->质变 物以类聚
语句->函数\类->模块->包
标准库模块 自定义模块
自己写好的模块也可以上传到官网作为第三方模块
模块化编程,把一个任务分解为多个模块,便于复用,可维护性强,团队协同
模块化编程流程
1.设计api,功能描述
2.编码实现api
3.模块中编写测试代码
python安装目录Doc目录可以查看api文档
模块导入
import 导入模块
本质是使用内置函数 __import__()
# as起别名
import math as m
# 模块也是对象,一个模块无论导入多少次生成同一对象
print(id(math))
print(type(math))
from ... import 导入模块中的成员
# import *表示导入所有
from math import pi,sin
sin(3.14)
动态导入
# 通过改变字符串的值导入不同模块,一般不需要
s = 'math'
m = __import__(s)
推荐通过importlib模块动态导入
import importlib
s = 'math'
a = importlib.import_module(s)
模块无论导入多少次,整个解释器进程只生成一个对象
# 重新加载模块
importlib.reload(math)
包
包本质就是文件夹,组织管理模块
必须包含 __init__.py
包可以包含模块和子包
# 导入包a下的模块module_A
import a.module_A
# 或者
from a import module_A
导入包本质是导入__init__.py文件
可通过定义all变量
__init__.py
__all__ = ["module_A","module_B"]
# 此时导入的是__all__定义的模块
from a import *
相对路径 - ./..
# 导入父级目录内容
from .. import module_A
# 导入同级目录内容
from . import module_B
sys.path | 模块搜索路径
模块搜索路径:
内置->当前目录->主目录->pythonpath(如已设置)->标准链接库目录->.pth文件中的路径
import sys
sys.path.append('d:/')
# 模块搜索路径
print(sys.path)
.pth文件
python安装目录\lib\site-packages
新建->输入文件名 .pth.
模块发布到本地
发布:
1.需要发布的模块拷贝到包
2.包同级建立setup.py文件
from distutils.core import setup
setup(
name='baizhanMath2', # 对外我们模块的名字
version='1.0', # 版本号
description='这是第一个对外发布的模块,测试哦', #描述
author='gaoqi', # 作者
author_email='gaoqi110@163.com',
py_modules=['baizhanMath2.demo1','baizhanMath2.demo2'] # 要发布的模块
)
3.右键根路径进入终端
# 对外发布
python setup.py sdist
####### 安装
第三方库在 安装目录/lib/site-packages/目录下
# 安装
python setup.py install
打开setting->intepreper可以看到
然后就可以import并调用了
模块上传到官网
1.pypi.python.org 注册
2.用户家目录创建 .pypirc文件
[distutils]
index-servers=pypi
[pypi]
repository = https://upload.pypi.org/legacy/
username = 账户名
password = 你自己的密码
3.进入setup.py所在目录,执行
python setup.py sdist upload
4.安装已上传模块
setting->project intepreter点+号->搜索安装
或者命令行执行:
pip install 模块名
已上传模块可能搜索不到,官网建立索引需要时间








网友评论