美文网首页
python基础-08-文件 | 模块

python基础-08-文件 | 模块

作者: 西海岸虎皮猫大人 | 来源:发表于2020-03-15 12:16 被阅读0次

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 模块名
已上传模块可能搜索不到,官网建立索引需要时间

相关文章

  • python基础-08-文件 | 模块

    1 文件概述 持久化操作即文件操作数据库底层操作仍然是文件IO文本文件存储字符,可用记事本打开,默认使用Unico...

  • Python基础-常用内置模块 shutil

    Python基础-常用内置模块 shutil shutil 高级的 文件、文件夹、压缩包 处理模块 shu...

  • Python-01基础-05模块

    Python基础-05模块 python中的模块是什么?简而言之,在python中,一个文件(以“.py”为后缀名...

  • pyhton基础

    Python基础 - 基础 1. 第一句python - 后缀名是可以是任意? - 导入模块时,如果不是.py文件...

  • 理解 python 模块加载和路径查找

    引用自理解 python 模块加载和路径查找 基础概念 module模块, 一个 py 文件或以其他文件形式存在的...

  • python 数据分析基础 day5-读写csv文件

    今天说一下使用python读写csv文件。读写csv文件可以使用基础python实现,或者使用csv模块、pand...

  • 简书历史文章列表(不定时更新)

    Linux命令 Linux命令-文件管理Linux命令-系统管理 Python基础、相关模块及进阶 Python开...

  • Python模块与包

    Python模块与包 模块 模块是非常简单的Python文件,单个Python文件就是一个模块,两个文件就是两个模...

  • 解析Python模块与包

    模块 模块是非常简单的Python文件,单个Python文件就是一个模块,两个文件就是两个模块。 import语句...

  • 6.Python-模块和包

    模块和包 模块 Python会将所有 .py结尾的文件认定为Python代码文件,一个完整的python文件就是一...

网友评论

      本文标题:python基础-08-文件 | 模块

      本文链接:https://www.haomeiwen.com/subject/bnncehtx.html