模块导入与包进阶

基本内置模块

OS模块

os,就是operating system的缩写,译作:操作系统。

os模块是Python标准库中的一个用于访问操作系统相关功能的常用模块,它提供了很多使用操作系统功能和访问操作系统信息的方法和属性。但os模块中的提供的操作并不是在所有的操作系统都通用的,有些操作的实现是基于特定系统平台的,比如linux系统相关的文件权限管理和进程管理。os模块的主要功能:

  • 访问和操作系统相关信息
  • 操作目录及文件
  • 执行系统命令
  • 管理进程(到后面学习到并发编程再学这个)

模块导入方式

import os

常用属性

属性 描述
os.name 查看当前操作系统的名称。Windows平台下返回‘nt’,Linux或mac OS则返回‘posix’。
os.sep 当前平台的路径分隔符。在windows系统下,为‘\’,在Linux系统中,为‘/’。
os.linesep 行结束符。在不同的系统中行尾的结束符是不同的,例如在Windows下为‘\r\n’,Linux系统下为"\n"
os.environ 获取当前操作系统的环境变量

linux系统下运行代码:

import os

if __name__ == '__main__':
    print(os.name)
    print(os.sep)
    print(os.environ)
    print(os.environ.get("USERNAME"))
    """
    environ({
    'COMPUTERNAME': 'WIN-Q0O96JBBIJ2',   # 计算机设备名称
    'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe',   # cmd终端的路径
    'HOMEDRIVE': 'C:',                     # 当前系统用户家目录所在的驱动器盘符
    'HOMEPATH': '\\Users\\Administrator',  # 当前系统用户的家目录
    'LOGONSERVER': '\\\\WIN-Q0O96JBBIJ2',  # 主机名
    'NUMBER_OF_PROCESSORS': '12',          # 当前系统CPU的逻辑处理器数量
    'OS': 'Windows_NT',                    # 操作系统类型
    'PATH': 'C:\\tool\\Python38;C:\\WINDOWS\\system32;C:\\WINDOWS;...', # 操作系统系统环境变量中,可执行文件的搜索路径 
    'PROMPT': '(djdemo) $P$G',   # cmd终端命令提示符的格式
    'PYTHONIOENCODING': 'UTF-8', # python默认编码
    'PYTHONPATH': 'C:\\Users\\Administrator\\PycharmProjects\\pythonProject;',   # python可导包文件的搜索路径
    'PYTHONUNBUFFERED': '1',      # python错误输出缓存设置
    'SYSTEMROOT': 'C:\\WINDOWS',  # 系统主目录
    'TEMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp',   # 临时文件夹
    'TMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp',    # 临时文件夹
    'USERNAME': 'Administrator',   # 当前系统用户名
    'WINDIR': 'C:\\WINDOWS',       # 操作系统目录的位置
    })
    """
    print(os.linesep.encode())  # b'\r\n'

windows系统下运行代码:

import os

if __name__ == '__main__':
    print(os.name)
    print(os.sep)
    print(os.environ)
    print(os.environ.get("USERNAME"))
    """
    environ({
    'COMPUTERNAME': 'WIN-Q0O96JBBIJ2',   # 计算机设备名称
    'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe',   # cmd终端的路径
    'HOMEDRIVE': 'C:',                     # 当前系统用户家目录所在的驱动器盘符
    'HOMEPATH': '\\Users\\Administrator',  # 当前系统用户的家目录
    'LOGONSERVER': '\\\\WIN-Q0O96JBBIJ2',  # 主机名
    'NUMBER_OF_PROCESSORS': '12',          # 当前系统CPU的逻辑处理器数量
    'OS': 'Windows_NT',                    # 操作系统类型
    'PATH': 'C:\\tool\\Python38;C:\\WINDOWS\\system32;C:\\WINDOWS;...', # 操作系统系统环境变量中,可执行文件的搜索路径 
    'PROMPT': '(djdemo) $P$G',   # cmd终端命令提示符的格式
    'PYTHONIOENCODING': 'UTF-8', # python默认编码
    'PYTHONPATH': 'C:\\Users\\Administrator\\PycharmProjects\\pythonProject;',   # python可导包文件的搜索路径
    'PYTHONUNBUFFERED': '1',      # python错误输出缓存设置
    'SYSTEMROOT': 'C:\\WINDOWS',  # 系统主目录
    'TEMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp',   # 临时文件夹
    'TMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp',    # 临时文件夹
    'USERNAME': 'Administrator',   # 当前系统用户名
    'WINDIR': 'C:\\WINDOWS',       # 操作系统目录的位置
    })
    """
    print(os.linesep.encode())  # b'\r\n'

环境变量

所谓的环境变量(Environment Variables),就是存储在计算机系统中的软件相关的路径信息或软件配置参数。在计算机执行指令(系统软件,应用软件,系统命令)时,为执行的指令提供的一个环境信息(变量信息,变量参数)。如果在系统执行指令时如果没有对应的环境变量,则可能会导致系统找不到当前指令的存储位置或出现操作失败等问题。

img

os.environ提供了在python运行程序期间临时改变环境变量的操作。

注意:是临时改变,当程序执行完了以后会再次恢复。如果要永久修改,则可以直接到系统窗口或者系统文件中进行永久修改。

读取环境变量

os.environ 是一个环境变量的字典,可以通过 get 方法或者中括号获取键对应的值。一般工作中使用get。

import os
# 如果有这个键,返回对应的值,如果没有,则返回 none。而使用中括号会报错。
print(os.environ.get("HOME"))

# 也可以设置默认值,当键存在时返回对应的值,不存在时,返回默认值
print(os.environ.get("HOME", "/"))	# 环境变量HOME不存在,返回 / 

# 也可以使用getenv来读取
print( os.getenv('变量名') )

新增环境变量

os.environ['变量名'] = '变量值' # 其中key和value均为string类型,否则出问题
os.putenv('变量名', '变量值')
os.environ.setdefault('变量名', '变量值')

更新环境变量

os.environ['变量名']='变量值'

删除环境变量

del os.environ['变量名']
del(os.environ['变量名'])

判断环境变量是否存在

'变量名' in os.environ   # 存在返回 True,不存在返回 False

文件操作

方法 描述
os.remove(path) 删除文件,不能删除目录,文件不存在则报错
os.unlink(path) 删除文件,不能删除目录,文件不存在则报错
os.rename(src, dst) 重命名文件,src源文件不存在,或dst新文件名已存在都会报错。
os.stat(file) 获取文件/目录的属性
os.chmod(path, mode) 修改文件权限,mode为代表文件权限的八进制整数
os.utime(file) 修改文件的最后修改事件和最后访问时间
os.access(path, mode) 判断文件权限是否可访问
os.chown(path, uid, gid) 更改文件所有者,只支持linux/macos等类unix或unix系统下超级管理员权限进行操作
import os, stat

"""os.remove() 删除一个指定路径的文件"""
os.remove("1.exe")
# 少用
os.unlink("1.exe")

"""os.rename() 文件重命名"""
os.rename("1.py", "2.py")

"""os.stat() 获取文件/目录的属性"""
attr = os.stat("home")
print(attr)
"""
os.stat_result(
    st_mode=33206,
    st_ino=6473924465222114,
    st_dev=3289389819,
    st_nlink=1,
    st_uid=0,
    st_gid=0,
    st_size=29,
    st_atime=1649181251,
    st_mtime=1649181251,
    st_ctime=1649180911
)
"""
print(attr[0])   # 获取文件描述符,相当于 print( attr[stat.ST_MODE])
print(attr[6])   # 获取文件大小[字节],相当于 print( attr[stat.ST_SIZE])
print(attr[7])  # 文件的最后访问时间,相当于 print( attr[stat.ST_ATIME])
print(attr[8])  # 文件的最后修改时间,相当于 print( attr[stat.ST_MTIME])
print(attr[9])  # 文件的创建时间,相当于 print( attr[stat.ST_CTIME])
print(stat.S_ISDIR(attr[stat.ST_MODE]))  # 判断当前是否目录
print(stat.S_ISREG(attr[stat.ST_MODE]))  # 判断当前是否普通文件


"""os.chmod() 修改文件/目录权限"""
os.chmod("2.py", 0o700)
os.chmod("home", 0o644)
# 终端下可以通过ls -l 进行查看执行效果

"""os.utime() 修改文件时间戳"""
import time
ts = time.time()
os.utime("2.py", (ts, ts))

data = os.stat("2.py")
print(data[7]) # 获取当前文件的最后访问时间
print(data[8]) # 获取当前文件的最后修改时间

"""os.chown() 修改文件拥有者"""
# windows下会报错
os.chown("2.py", 100, -1)


"""os.access() 判断当前程序对指定文件的访问权限"""
print(os.access("2.py", os.R_OK))  # 是否可读,相当于 print(os.access("2.py", 4))
print(os.access("2.py", os.W_OK))  # 是否可读,相当于 print(os.access("2.py", 2))
print(os.access("2.py", os.X_OK))  # 是否可读,相当于 print(os.access("2.py", 1))

目录操作

方法 描述
os.mkdir() 新建空目录,目录存在,则报错。
os.listdir(path=".") 列出指定目录下所有文件组成的列表,不指定path,则默认当前程序所在的工作目录
os.scandir(path=".") 列出指定目录下所有文件组成的迭代器,不指定path,则默认当前程序所在的工作目录
os.getcwd() 获取当前程序的工作目录
os.chdir(path) 改变当前程序的工作目录
os.rmdir() 删除空目录,删除非空目录会报错,如果要删除非空目录,则可以使用shutil.rmtree()
os.makedirs() 创建多级目录,如果多级目录重叠则报错,部分重叠不会报错。
os.removedirs() 删除多级目录,如果是非空目录则会报错,参考上面os.mkdir的描述。
import os

"""os.mkdir() 新建空目录"""
os.mkdir("home")
# 如果要给目录创建文件,则可以使用之前的open内置函数
for i in range(10):
    open(f"home/test_{i}.py", "w")

"""os.listdir() 列出当前程序的工作目录下的所有文件"""
# 列出当前程序的工作目录下所有文件
file_list = os.listdir()
print(file_list)

# 列出指定目录下所有文件
file_list = os.listdir("home")
print(file_list)

"""os.getcwd() 获取当前程序的工作目录"""
print(os.getcwd())

"""os.chdir() 改变当前程序的工作目录"""
os.chdir("home")

# 查看改变后的工作目录
print(os.getcwd())

# 因为上面已经改变了当前程序的工作目录,因此再次调用listdir得到的就是改变后的工作目录下的文件
file_list = os.listdir()
print(file_list)

"""os.rmdir() 删除空目录"""
# 先创建一个空目录进行测试
os.mkdir("demoDir")

import time
time.sleep(5)

# 打开系统目录来观察,在pycharm因为输出缓冲的原因是看不到效果的,
# 5秒后删除该空目录
os.rmdir("demoDir")

# 以下代码会报错,因为home里面有文件,是非空目录
# os.rmdir("home")

# 删除非空目录
del_dir = "sms"
os.chdir(del_dir)
for i in os.listdir():
    os.remove(f"{del_dir}/{i}")
os.chdir("..")
os.rmdir(del_dir)

# 当然,上面的代码有问题,如果删除的目录中不仅存在文件,还存在子目录的话,则会出错。
# 但是,如果在没有使用其他的模块提供的操作情况下,上面的思路是没有问题的。


"""os.makedirs() 创建多级目录"""
os.makedirs("2021/05/01")

"""os.removedirs() 删除多级目录"""
os.removedirs("2021/06/01")

路径操作

方法 描述
os.path.isdir() 判断name是不是一个目录,name不是目录就返回false
os.path.isfile() 判断name是不是一个文件,不存在返回false
os.path.islink() 判断文件是否连接文件,返回boolean
os.path.dirname(filename) 返回文件路径的目录部分
os.path.basename(filename) 返回文件路径的文件名部分
os.path.join(dirname,basename) 将文件路径和文件名凑成完整文件路径
os.path.abspath(name) 获得绝对路径
os.path.realpath(path) 返回path的真实路径
os.path.getatime() 返回最近访问时间 浮点型
os.path.getmtime() 返回上一次修改时间 浮点型
os.path.getctime() 返回文件创建时间 浮点型
os.path.getsize() 返回文件大小 字节单位
os.path.exists() 判断文件或目录是否存在
os.path.normcase(path) 转换path的大小写和斜杠
os.path.isabs() 如果path是绝对路径,返回True
os.path.samefile() 是否相同路径的文件,返回boolean,文件不存在则会报错
os.path.split(filename) 将文件路径和文件名分割(会将最后一个目录作为文件名而分离)
os.path.normpath(path) 规范path字符串形式
os.path.relpath(path[, start]) 从start开始计算相对路径
os.path.commonprefix(list) 返回list(多个路径)中,所有path共有的最长的路径
os.path.expanduser(path) 把path中包含的~~user转换成用户目录
import os

""" os.path.isdir() 判断name是不是一个目录,name不是目录就返回false"""
print( os.path.isdir("home") ) # True
print( os.path.isdir("2.py") ) # True,不是目录,或不存在的文件都会返回False

""" os.path.isfile() 判断name是不是一个文件,不存在返回false"""
print( os.path.isfile("3333.py"))  # False, 不是文件,或不存在的文件都会返回False
print( os.path.isfile("2.py"))  # True

""" os.path.islink() 判断文件是否连接文件,返回boolean"""
print(os.path.islink("2.py"))  # False,
# 注意:普通文件不是链接文件
# linux下创建链接文件
# 硬链接: ln 源文件名绝对路径   链接文件名绝对路径
# 软链接: ln -s 源文件名绝对路径   链接文件名绝对路径

""" os.path.dirname(filename) 返回文件路径的目录部分"""
# 返回当前文件路径
dir = os.path.dirname(__file__)
print(dir)

""" os.path.basename(filename) 返回文件路径的文件名部分"""
# 返回当前文件的文件名部分
dir = os.path.basename(__file__)
print(dir)

""" os.path.join(dirname,basename) 将文件路径和文件名凑成完整文件路径"""
dir  = "/python/project"
file = "2.py"
ret = os.path.join(dir, file)
print(ret)  # /python/project/2.py

# 工作中常见用法
dir = os.path.dirname(__file__)
file = "2.py"
ret = os.path.join(dir, file)
print(ret)

""" os.path.abspath(name) 获得绝对路径"""
print( os.path.abspath("2.py") )
print( os.path.abspath(".") )
print( os.path.abspath("../2.py") )
print( os.path.abspath("../home/2.py") )

""" os.path.realpath(path) 返回path的真实路径"""
print( os.path.abspath("2.py") )
print( os.path.abspath(".") )
print( os.path.abspath("../2.py") )
print( os.path.abspath("../home/2.py") )

""" os.path.getatime() 返回最近访问时间 浮点型"""
print( os.path.getatime("2.py") )

""" os.path.getmtime() 返回上一次修改时间 浮点型"""
print( os.path.getmtime("2.py") )

""" os.path.getctime() 返回文件创建时间 浮点型"""
print( os.path.getctime("2.py") )

""" os.path.getsize() 返回文件大小 字节单位"""
print( os.path.getsize("2.py") )

""" os.path.exists() 判断文件或目录是否存在"""
print( os.path.exists("2.py") )
print( os.path.exists("225.py") )
print( os.path.exists("mydemo") )

""" os.path.normcase(path) 转换path的大小写和斜杠"""
print( os.path.normcase("../home/2.py") )

""" os.path.isabs() 如果path是绝对路径,返回True"""
print( os.path.isabs("../home/2.py") )

""" os.path.samefile() 是否相同路径的文件,返回boolean,文件不存在则会报错"""
print( os.path.samefile("2.py", "./2.py") )
# print( os.path.samefile("2.py", "home/2.py"))

""" os.path.split(filename) 将文件路径和文件名分割(会将最后一个目录作为文件名而分离)"""
print( os.path.split("home/2.py") )  # ('home', '2.py')

""" os.path.normpath(path) 规范path字符串形式"""
print( os.path.normpath("./home\\2.py") )  # home/2.py

""" os.path.relpath(path[, start]) 从start开始计算相对路径"""
print( os.path.relpath("./test_2.py", "home") )  # ../test_2.py

""" os.path.commonprefix(list) 返回list(多个路径)中,所有path共有的最长的路径"""
path_list = ["home/2022/test_2.py", "home/2022/05/test_01.py"]
print( os.path.commonprefix(path_list) )  # home/2022/

""" os.path.expanduser(path) 把path中包含的”~”和”~user”转换成用户目录"""
print( os.path.expanduser("~/Desktop/home/2.py") )  # /home/moluo/Desktop/home/2.py

系统参数与命令执行

方法 描述
os.popen(command) 创建一个管道对象,通往 cmd/shell终端。返回值是连接到管道的文件对象。
os.system(command) 执行操作系统命令,无法获取屏幕输出的信息,命令执行成功返回0,命令执行失败返回错误提示
os.cpu_count() 获取当前系统的逻辑cpu个数

代码:

import os

""" os.popen() 执行终端命令"""
ret = os.popen("ls -l")
print(ret.read())

ret = os.popen("ls -l")
print(ret.readlines())

# 执行多条命令
ret = os.popen("mkdir my_demo && cd my_demo && echo 'print(\"hello world\") ' > 1.py && python ./1.py")
print(ret.read())


""" os.system() 执行终端命令"""
ret = os.system("ls -l")
print(ret)

ret = os.system("ll")
print(ret)

"""获取CPU数量,无法获取物理CPU个数,后面可用psutils获取物理CPU个数"""
print( os.cpu_count() )  # 12

练习

1. 把指定目录中所有的文件按文件的创建时间分别存放到对应的年/月/日目录下

2. 使用代码创建多个py文件,并实现文件备份功能

3. 计算一个文件夹里所有文件的总大小【递归实现】

shutil模块

shutil模块提供了一系列对文件和文件集合的高阶操作。 特别是提供了一些支持文件拷贝和删除、复制、移动的函数。

方法 描述
copyfileobj(fsrc, fdst[, length=0]) 复制文件,length的单位是字符,表示一次读多少字符。
copyfile(src,dst) 复制文件内容,不包含文件状态相关的元信息
copymode(src,dst) 仅复制文件权限 , 不包括内容,文件不存在则报错
copystat(src,dst) 复制文件状态相关的元信息,包括权限,组,用户,修改时间等,不包括内容
copy(src,dst) 复制文件权限和内容
copy2(src,dst) 复制文件权限和内容,还包括权限,组,用户,时间等
copytree(src,dst) 复制文件夹里所有内容(递归复制)
rmtree(path) 递归删除文件或者目录
move(src,dst) 移动文件或者文件夹

代码:

import shutil

""" copyfileobj(fsrc, fdst) 完整复制文件"""
# fsrc = open("2.py",mode="r",encoding="utf-8")
# fdst = open("2.txt",mode="w",encoding="utf-8")
# shutil.copyfileobj(fsrc, fdst)

""" copyfile(src,dst) 仅复制文件内容 , 底层调用了 copyfileobj """
# shutil.copyfile("2.txt","3.txt")


""" copymode(src,dst)  仅复制文件权限 """
# shutil.copymode("1.txt","4.txt")

""" copystat(src,dst)  仅复制文件状态的元信息,包括权限,组,用户,修改时间等,不包括内容 """
# shutil.copystat("1.txt","5.txt")

""" copy(src,dst)  复制文件权限和内容 """
# shutil.copy("1.txt","6.txt")

""" copy2(src,dst)  复制文件权限和内容,还包括权限,组,用户,时间等 """
# shutil.copy2("1.txt","7.txt")

""" copytree(src,dst) 递归文件夹里所有内容 """
# shutil.copytree("home","demo")

""" rmtree(path) 递归删除当前文件夹及其中所有内容"""
# shutil.rmtree("cccc")

""" move(path1,paht2)  移动文件或者文件夹 """
# shutil.move("6.txt","./bbb.js/789.txt")

sys模块

sys模块主要是针对与Python解释器相关的变量和方法,不是主机操作系统。

模块导入方式

import sys
属性/方法 描述
sys.path 返回python解释器的搜索模块与包路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称,Linux系统是"linux", windows系统是"win32", max OS是"darwin"
sys.modules 返回系统导入的模块字段,key是模块名,value是模块
sys.version 获取Python解释程序的版本信息
sys.version_info ‘final‘表示最终,也有‘candidate‘表示候选,表示版本级别,是否有后继的发行
sys.executable Python解释程序路径
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.hexversion 获取Python解释程序的版本值,16进制格式如:0x020403F0
sys.exec_prefix 返回python解释器安装的目录位置
sys.builtin_module_names Python解释器导入的内建模块列表
sys.getdefaultencoding() 返回当前你所用的默认的字符编码
sys.setdefaultencoding(name) 用来设置当前默认的字符编码,低版本2.7以下才有,python3中已经移除。
sys.exit(n) 退出程序,其实就是exit()函数

代码:

import sys

"""sys.path 返回python解释器的搜索模块与包路径,初始化时使用PYTHONPATH环境变量的值 """
print(sys.path)

# 临时增加一个导包路径,即可在后续操作中让python在新的路径中进行导包操作
# sys.path.insert(0, "路径字符串")


""" sys.platform 返回操作系统平台名称 """
print(sys.platform)  # linux, win32, darwin

""" sys.modules 返回系统导入的模块字段,key是模块名,value是模块 """
print(sys.modules)
# 返回所有python解释器已经导入的模块列表
print(sys.modules.keys())

""" sys.version 获取Python解释程序的版本信息 """
print(sys.version)
# 3.9.7 (default, Sep 16 2021, 13:09:58)
# [GCC 7.5.0]  # 表示我们使用的是Cpython

""" sys.api_version 解释器的C的API版本 """
print(sys.api_version)

""" sys.version_info ‘final‘表示最终,也有‘candidate‘表示候选,表示版本级别,是否有后继的发行 """
print(sys.version_info)
# sys.version_info(major=3, minor=9, micro=7, releaselevel='final', serial=0)


""" sys.executable Python解释程序路径 """
print(sys.executable)
# /home/moluo/anaconda3/bin/python

""" sys.argv 命令行参数List,第一个元素是程序本身路径 """
print(sys.argv)
# ['/home/moluo/Desktop/luffycity/luffycityapi/demo/demo1.py']


""" sys.hexversion 获取Python解释程序的版本值,16进制格式如:0x020403F0 """
print(sys.hexversion)  # 50923504

""" sys.exec_prefix 返回python解释器安装的目录位置 """
print(sys.exec_prefix)  # /home/moluo/anaconda3

""" sys.builtin_module_names Python解释器导入的内建模块列表 """
print(sys.builtin_module_names)


""" sys.getdefaultencoding() 返回当前你所用的默认的字符编码格式 """
print(sys.getdefaultencoding())  # utf-8

""" sys.exit(n) 退出程序,正常退出时exit(0) """
sys.exit()  # exit()
print("hello")

标准输入/标准输出/标准错误输出

我们要弄清什么是标准输入/标准输出,首先需要弄懂什么是IO。

I就是Input,译作输入,表示从外部设备输入到内存。O就是output,译作输出,表示从内存输出到外部设备。

而标准输入和标准输出就是用于IO操作的。在linux操作系统中,一切文件/目录/设备都是文件。因此所谓的标准输入和标准输出其实就是linux系统下的两个文件,/dev/stdin和/dev/stdout。这两个文件并非普通文件,而是设备的链接文件。因此, 对/dev/stdin和/dev/stdout的读写操作,本质上对系统默认输入和输出设备进行读写,系统默认的输入和输出设备默认一般是终端。当然,/dev/stdin和/dev/stdout仅仅是链接文件,并非真正的设备,他们之间的关系仅仅是关联。

属性/方法 描述
sys.stdout 标准输出
sys.stdout.write(‘aaa‘) 标准输出内容
sys.stdout.writelines() 无换行输出
sys.stdin 标准输入
sys.stdin.read() 输入一行
sys.stdin.readline() 从标准输入读一行,sys.stdout.write(“a”) 屏幕输出a
sys.stderr 标准错误

代码:

import sys

""" sys.stdout 标准输出 """
# print(sys.stdout)  # <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>

""" sys.stdout.write() 标准输出内容 """
sys.stdout.write("hello world")  # hello world
sys.stdout.write("hello world\n")  # hello world

print("hello world") # 调用print的过程中,实际上是引用了sys.stdout.write(obj+’/n’)

""" sys.stdout.writelines() 无换行输出 """
sys.stdout.writelines(["hello", " world\n"])  # hello world

""" sys.stdin 标准输入 """
# print(sys.stdin)  # <_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'>

""" sys.stdin.read() 输入一行 """
# print("请输入您的姓名:", end="")
# ret = sys.stdin.read()  # 输入完成以后,回车,并使用ctrl+d结束输入
# print(f"您刚才输入的是:{ret}")

""" sys.stdin.readline() 从标准输入读一行"""
# print("请输入您的姓名:", end="")
# ret = sys.stdin.readline()  # 输入完成以后,回车,表示结束输入
# print(f"您刚才输入的是:{ret}")

# ret = input("请输入您的姓名:") # 内部本质上执行了 sys.stdin.readline().strip(’/n’)
# print(f"您刚才输入的是:{ret}")



""" sys.stdin.readlines() 从标准输入读多行"""
# print("请输入您的留言:", end="")
# ret = sys.stdin.readlines()  # 输入完成以后,并使用ctrl+d结束输入
# print(f"您刚才输入的是:{ret}")


""" sys.stderr 错误输出 """
# print(sys.stderr)  # <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>

sys.stderr.write('对不起!!!!报错了!!!')

文件压缩模块

python中内置了一系列用于对文件进行打包和解压缩的标准库模块,常见的有tar模块、zip模块。

zipfile模块

基本使用

import zipfile
# 创建一个ZipFile对象, 表示一个zip文件
# ZipFile(路径包名,模式,压缩or打包,可选allowZip64)
zf = zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
# 参数:
# 1. file表示文件的路径或类文件对象(file-like object)
# 2. mode表示设置打开zip文件的访问权限模式,默认值为r
#     r    表示读取已经存在的zip文件
#     w    表示新建一个zip文档或覆盖一个已经存在的zip文档
#     a    表示将数据追加到一个现存的zip文档中。
# 3. compression表示在写zip文档时使用的压缩方法
#     zipfile.ZIP_STORED      只是存储模式,不会对文件进行压缩,这个是默认值
#     zipfile.ZIP_DEFLATED    对文件进行压缩
# 4. allowZip64,如果要操作的zip文件大小超过2G,则必须设置allowZip64=True。

压缩文件

import zipfile

# 1. zipfile.ZipFile()   写模式w打开或者新建压缩文件
zf = zipfile.ZipFile("1.zip","w",zipfile.ZIP_DEFLATED)

# 2. zf.write(路径,别名)  向压缩文件中添加文件内容
zf.write("/home/moluo/Desktop/1.py","1.py")
zf.write("/home/moluo/Desktop/2.py","1.py")

# 3. zf.close()          关闭压缩文件
zf.close()

支持with上下文管理器语句

import zipfile

# 1. zipfile.ZipFile()   写模式w打开或者新建压缩文件
with zipfile.ZipFile("1.zip","w",zipfile.ZIP_DEFLATED) as zf:
    # 2. zf.write(路径,别名)  向压缩文件中添加文件内容
    zf.write("/home/moluo/Desktop/1.py","1.py")
    zf.write("/home/moluo/Desktop/2.py","1.py")

解压文件

import zipfile

# 1. zipfile.ZipFile()    读模式r打开压缩文件
with zipfile.ZipFile("1.zip","r") as zf:
    # 2.zf.extractall(解压路径)             解压所有文件到某个路径下
    #   zf.extract(包内指定文件,解压路径)    解压指定的某个文件到某个路径下
    zf.extractall("/home/moluo/Desktop")
    # zf.extract("1.py","/home/moluo/Desktop")

追压文件

import zipfile

with zipfile.ZipFile("11.zip","a",zipfile.ZIP_DEFLATED) as zf:
    zf.write("/home/moluo/Desktop/3.py","3.py")

查看包内容

import zipfile

with zipfile.ZipFile("1.zip","r") as zf:
    data = zf.namelist()
    print(data)

tarfile模块

基本使用

import tarfile


# 打开或创建一个tar文件
tf = tarfile.open(name=None, mode='r')
# 参数:
# 1. name表示tar文件的路径
# 2. mode表示设置打开tar文件的访问权限模式,默认值为r
#     r    打开和读取使用透明压缩的tar文件
#     r:   打开和读取没有进行压缩的tar文件
#    r:gz  打开和读取使用gzip算法压缩的tar文件
#    r:bz2 打开和读取使用bzip2算法压缩的tar文件
#    r:xz  打开和读取使用lzma算法压缩的tar文件

#     w    新建或覆盖一个已存在的未压缩的tar文件
#    w:gz  新建或覆盖一个已存在的使用gzip算法压缩的tar文件
#    w:bz2 新建或覆盖一个已存在的使用bzip2算法压缩的tar文件
#    w:xz  新建或覆盖一个已存在的使用lzma算法压缩的tar文件
#     a    将文件追加到一个现存的未压缩的tar文件中

打包文件

打包归档,但是不进行压缩

import tarfile


tf = tarfile.open("data.tar","w")
# tf.add(路径,别名)
tf.add("/home/moluo/Desktop/1.py","1.py")
tf.add("/home/moluo/Desktop/2.py","2.py")
tf.add("/home/moluo/Desktop/3.py","3.py")
tf.close()

同样,也支持with上下文管理器语句

import tarfile


# 打开或创建一个tar包
with tarfile.open("data.tar","w") as tf:
    # tf.add(路径,别名)
    tf.add("/home/moluo/Desktop/1.py","1.py")
    tf.add("/home/moluo/Desktop/2.py","2.py")
    tf.add("/home/moluo/Desktop/3.py","3.py")

打包压缩文件

import tarfile


# bz2, 使用bzip2算法压缩打包
tf = tarfile.open("data.tar.bz2","w:bz2")
tf.add("/home/moluo/Desktop/1.py","1.py")
tf.add("/home/moluo/Desktop/2.py","2.py")
tf.add("/home/moluo/Desktop/3.py","3.py")
tf.close()

# gz, 使用gzip算法压缩打包
tf = tarfile.open("data.tar.gz","w:gz")
tf.add("/home/moluo/Desktop/1.py","1.py")
tf.add("/home/moluo/Desktop/2.py","2.py")
tf.add("/home/moluo/Desktop/3.py","3.py")
tf.close()

# xz, 使用lzma算法压缩打包
tf = tarfile.open("data.tar.xz","w:xz")
tf.add("/home/moluo/Desktop/1.py","1.py")
tf.add("/home/moluo/Desktop/2.py","2.py")
tf.add("/home/moluo/Desktop/3.py","3.py")
tf.close()

解压文件

import tarfile

tf = tarfile.open("data.tar.bz2","r")
# 解压所有文件到指定路径
# tf.extractall("/home/moluo/Desktop")
# 解压单个文件到指定路径
tf.extract("3.py","/home/moluo/Desktop")
tf.close()

查看包内容

import tarfile

with tarfile.open("1.zip","r") as tf:
    data = tf.getnames()
    print(data)

追加打包

注意:这里是追加打包,不是追加压缩!!!无法直接追加压缩!!!

import tarfile

# 只能对之前使用w模式创建的未压缩的tar包进行追加!!看清楚后缀!!!
with tarfile.open("data.tar","a") as tf:
	tf.add("/home/moluo/Desktop/3.py","3.py")

解决tarfile追加不压缩的问题

import tarfile, os
# 1. 解压文件
with tarfile.open("data.tar.bz2","r") as tf:
	tf.extractall("/home/moluo/Desktop")

# 2. 追加合并文件
os.system("cp -a /home/moluo/Desktop/4.py  " + "/home/moluo/Desktop")

# 3. 重新打包
list_file = os.listdir("/home/moluo/Desktop")
# print(list_file)

# 创建一个新的bz2模式的压缩包
with tarfile.open("data_new.tar.bz2","w:bz2") as tf:
	# 循环遍历文件夹当中的所有内容
	for file in list_file:
		# 拼接路径
		file_path = os.path.join("/home/moluo/Desktop", file)
		# tf.add (路径,别名)
		tf.add(file_path, file)

基于生成器来提取tar大文件中指定内容

import os
import tarfile

def py_files(members):
    for tarinfo in members:
        if os.path.splitext(tarinfo.name)[1] == ".py":
            yield tarinfo
tar = tarfile.open("data.tar.gz")
tar.extractall(members=py_files(tar))
tar.close()
posted @ 2023-03-01 13:15  ihuahua1415  阅读(36)  评论(0)    收藏  举报
*/