26.Python文件I/Oos模块&shutil模块详解

Posted 孤寒者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了26.Python文件I/Oos模块&shutil模块详解相关的知识,希望对你有一定的参考价值。

目录:

每篇前言:


Python文件I/O(四)

1.1 os模块方法

os 模块提供了非常丰富的方法用来处理文件和目录。

常用方法示例:

# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os

# 重命名文件test1.txt为test2.txt。
os.rename( "test1.txt", "test2.txt" )
# 删除一个已经存在的文件test2.txt
os.remove("test2.txt")
# 创建目录test
os.mkdir("test")
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os

# 给出当前的目录
print(os.getcwd())
#显示当前目录的所有文件名
print(os.listdir(os.getcwd()))
# 将当前目录改为"E:"
os.chdir("E:")
# 给出当前的目录
print(os.getcwd())
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os

# rmdir()方法删除目录,目录名称以参数传递。
# 在删除这个目录之前,它的所有内容应该先被清除。
os.rmdir("/tmp/hive")

如果/tmp/hive目录里有内容,则会抛出异常:

Traceback (most recent call last):
  File "***/os.py", line 7, in <module>
    os.rmdir("/tmp/hive")
WindowsError: [Error 145] : '/tmp/hive'

1.1.1 os递归删除目录

# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os

def rmDirs(dirPath):
    for root, dirs, files in os.walk(dirPath, topdown=False):
        for name in files:
            os.remove(os.path.join(root, name))
        for name in dirs:
            os.rmdir(os.path.join(root, name))
    os.rmdir(dirPath)
    
rmDirs("E:")

1.1.2 os常用的方法

1.1.3 os.walk()深入讲解

os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下。

walk()方法语法格式如下:

  • os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

参数:

  • top – 根目录下的每一个文件夹(包含它自己), 产生3-元组 (dirpath, dirnames, filenames)【文件夹路径, 文件夹名字, 文件名】。
  • topdown --可选,为True或者没有指定, 一个目录的的3-元组将比它的任何子文件夹的3-元组先产生 (目录自上而下)。如果topdown为 False, 一个目录的3-元组将比它的任何子文件夹的3-元组后产生 (目录自下而上)。
  • onerror – 可选,是一个函数; 它调用时有一个参数, 一个OSError实例。报告这错误后,继续walk,或者抛出exception终止walk。
  • followlinks – 设置为 true,则通过软链接访问目录。

输出指定目录下所有文件以及文件夹名字:

# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os

for root, dirs, files in os.walk("E:"):
    # 所有文件
    for name in files:
        print(os.path.join(root, name))
    # 所有目录
    for name in dirs:
        print(os.path.join(root, name))

1.1.4 树形显示目录

# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os

def show_dir(dir, layer=0):
    listdir = os.listdir(dir)
    for index, file in enumerate(listdir):
        file_path = os.path.join(dir, file)
        print("|  " * (layer - 1), end="")
        if (layer > 0):
            print("--" if index == len(listdir) - 1 else "|--", end="")
        print(file)
        if (os.path.isdir(file_path)):
            show_dir(file_path, layer + 1)

show_dir(r'E:\\pycharm_pro\\www')

1.1.5 os.path常用方法


注意:
路径拼接: os.path.join(path1,path2….)

a = os.path.join(r'C:\\my\\python',r'pycharm_work')     # 注意第二个以及更多的路径前不能加反斜杠
print(a)                          				      # 输出为:C:\\my\\python\\pycharm_work

实战讲解:

# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os

print(os.path.basename('/root/test/tmp.txt'))  # 返回文件名
print(os.path.dirname('/root/test/tmp.txt'))  # 返回目录路径
print(os.path.split('/root/test/tmp.txt'))  # 分割文件名与路径
print(os.path.splitext('/path/to/file.txt')) # 拆分文件扩展名
print(os.path.join('root', 'aaa', 'tmp.txt'))  # 将目录和文件名合成一个路径

输出文件的相关信息:

# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os,time

file = 'CSDN_lotto.py'  # 文件路径

print(os.path.getatime(file))  # 输出最近访问时间
print(os.path.getctime(file))  # 输出文件创建时间
print(os.path.getmtime(file))  # 输出最近修改时间
print(time.gmtime(os.path.getmtime(file)))  # 以struct_time形式输出最近修改时间
print(os.path.getsize(file))  # 输出文件大小(字节为单位)
print(os.path.abspath(file))  # 输出绝对路径
print(os.path.normpath(file))  # 规范path字符串形式

2.1 Shutil的常用用法

shutil是 python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建、删除、查看等方法,还提供了对文件以及目录的路径操作。shutil模块提供了移动、复制、 压缩、解压等操作,恰好与os互补,共同一起使用,基本能完成所有文件的操作。是一个非常重要的模块。

  • shutil.rmtree递归删除目录
  • shutil.copytree递归复制目录
  • shutil.copy复制文件

2.1.1 文件夹与文件操作

copyfileobj(fsrc, fdst, length=16*1024): 将fsrc文件内容复制至fdst文件,length为fsrc每次读取的长度,用做缓冲区大小。

  • fsrc: 源文件
  • fdst: 复制至fdst文件
  • length: 缓冲区大小,即fsrc每次读取的长度

copyfile(src, dst, follow_symlinks=True): 将src文件内容复制至dst文件

  • src: 源文件路径
  • dst: 复制至dst文件,若dst文件不存在,将会生成一个dst文件;若存在将会被覆盖
  • follow_symlinks:设置为True时,若src为软连接,则当成文件复制;如果设置为False,复制软连接。默认为True。Python3新增参数~

copymode(src, dst, follow_symlinks=True): 将src文件权限复制至dst文件。文件内容,所有者和组不受影响。

  • src: 源文件路径
  • dst: 将权限复制至dst文件,dst路径必须是真实的路径,并且文件必须存在,否则将会报文件找不到错误
  • follow_symlinks:设置为False时,src, dst皆为软连接,可以复制软连接权限,如果设置为True,则当成普通文件复制权限。默认为True。Python3新增参数~

copystat(src, dst, follow_symlinks=True): 将权限,上次访问时间,上次修改时间以及src的标志复制到dst。文件内容,所有者和组不受影响。

  • src: 源文件路径
  • dst: 将权限复制至dst文件,dst路径必须是真实的路径,并且文件必须存在,否则将会报文件找不到错误
  • follow_symlinks:设置为False时,src, dst皆为软连接,可以复制软连接权限、上次访问时间,上次修改时间以及src的标志,如果设置为True,则当成普通文件复制权限。默认为True。Python3新增参数~

copy(src, dst, follow_symlinks=True): 将文件src复制至dst。dst可以是个目录,会在该目录下创建与src同名的文件,若该目录下存在同名文件,将会报错提示已经存在同名文件。权限会被一并复制。本质是先后调用了copyfile与copymode而已

  • src:源文件路径
  • dst:复制至dst文件夹或文件
  • follow_symlinks:设置为False时,src, dst皆为软连接,可以复制软连接权限,如果设置为True,则当成普通文件复制权限。默认为True。Python3新增参数~

copy2(src, dst, follow_symlinks=True): 将文件src复制至dst。dst可以是个目录,会在该目录下创建与src同名的文件,若该目录下存在同名文件,将会报错提示已经存在同名文件。权限、上次访问时间、上次修改时间和src的标志会一并复制至dst。本质是先后调用了copyfile与copystat方法而已

  • src:源文件路径
  • dst:复制至dst文件夹或文件
  • follow_symlinks:设置为False时,src, dst皆为软连接,可以复制软连接权限、上次访问时间,上次修改时间以及src的标志,如果设置为True,则当成普通文件复制权限。默认为True。Python3新增参数~

ignore_patterns(*patterns): 忽略模式,用于配合copytree()方法,传递文件将会被忽略,不会被拷贝。

  • patterns:文件名称,元组

copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False): 拷贝文档树,将src文件夹里的所有内容拷贝至dst文件夹

  • src:源文件夹
  • dst:复制至dst文件夹,该文件夹会自动创建,需保证此文件夹不存在,否则将报错
  • symlinks:是否复制软连接,True复制软连接,False不复制,软连接会被当成文件复制过来,默认False
  • ignore:忽略模式,可传入ignore_patterns()
  • copy_function:拷贝文件的方式,可以传入一个可执行的处理函数,默认为copy2,Python3新增参数
  • ignore_dangling_symlinks:sysmlinks设置为False时,拷贝指向文件已删除的软连接时,将会报错,如果想消除这个异常,可以设置此值为True。默认为False,Python3新增参数~

rmtree(path, ignore_errors=False, οnerrοr=None): 移除文档树,将文件夹目录删除

  • ignore_errors:是否忽略错误,默认False
  • onerror:定义错误处理函数,需传递一个可执行的处理函数,该处理函数接收三个参数:函数、路径和excinfo

move(src, dst, copy_function=copy2): 将src移动至dst目录下。若dst目录不存在,则效果等同于src改名为dst。若dst目录存在,将会把src文件夹的所有内容移动至该目录下面

  • src:源文件夹或文件
  • dst:移动至dst文件夹,或将文件改名为dst文件。如果src为文件夹,而dst为文件将会报错
  • copy_function:拷贝文件的方式,可以传入一个可执行的处理函数。默认为copy2,Python3新增参数

disk_usage(path): 获取当前目录所在硬盘使用情况。Python3新增方法

  • path:文件夹或文件路径。windows中必须是文件夹路径,在linux中可以是文件路径和文件夹路径

chown(path, user=None, group=None): 修改路径指向的文件或文件夹的所有者或分组。Python3新增方法

  • path:路径
  • user:所有者,传递user的值必须是真实的,否则将报错no such user
  • group:分组,传递group的值必须是真实的,否则将报错no such group

which(cmd, mode=os.F_OK | os.X_OK, path=None): 返回当给定的 cmd 被调用时将要运行的可执行文件的路径。 如果没有 cmd 会被调用则返回 None。

  • mode 是一个传递给 os.access() 的权限掩码,在默认情况下将确定文件是否存在并且为可执行文件。

  • 当未指定 path 时,将会使用 os.environ() 的结果,返回 “PATH” 的值或回退为 os.defpath。

  • 在 Windows 上当前目录总是会被添加为 path 的第一项,无论你是否使用默认值或提供你自己的路径,这是命令行终端在查找可执行文件时所采用的行为方式。 此外,当在 path 中查找 cmd 时,还会检查 PATHEXT 环境变量。 例如,如果你调用 shutil.which(“python”),which() 将搜索 PATHEXT 来确定它要在 path 目录中查找 python.exe。 例如,在 Windows 上:

>>> shutil.which("python")
'C:\\\\Python33\\\\python.EXE'

2.1.2 归档操作

shutil还提供了创建和读取压缩和存档文件的高级使用程序。内部实现主要依靠的是zipfile和tarfile模块。

make_archive(base_name, format, root_dir, …): 生成压缩文件。

  • base_name:压缩文件的文件名,不允许有扩展名,因为会根据压缩格式生成相应的扩展名
  • format:压缩格式
  • root_dir:将指定文件夹进行压缩
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import shutil,os
base_name = os.path.join(os.getcwd(),"aaa")
format = "zip"
root_dir = r"D:\\PycharmProjects\\demo1\\numpytest"
# 将root_dir文件夹下的内容进行压缩,生成一个aaa.zip文件
shutil.make_archive(base_name, format, root_dir)

get_archive_formats(): 获取支持的压缩文件格式。目前支持的有:tar、zip、gztar、bztar。在Python3还多支持一种格式xztar。

unpack_archive(filename, extract_dir=None, format=None): 解压操作。Python3新增方法

  • filename:文件路径
  • extract_dir:解压至的文件夹路径。文件夹可以不存在,会自动生成
  • format:解压格式,默认为None,会根据扩展名自动选择解压格式
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import shutil,os
zip_path = os.path.join(os.getcwd(),"aaa.zip")
extract_dir = os.path.join(os.getcwd(),"test")
shutil.unpack_archive(zip_path, extract_dir)

get_unpack_formats(): 获取支持的解压文件格式。目前支持的有:tar、zip、gztar、bztar和xztar。Python3新增方法。

拓展:

文件访问编码:

文件内容:

adafsd
asdfasdfd
sadfdsfds
sdafdsf
吴某
你真帅
hello

例子:::
with open(‘shuju.txt’,‘r+’,encoding =‘ASCII’,errors = ‘ignore’) as f:
# 如果非想用ASCII编码方法打开一个包含中文的文件
#(ASCII只能打开英文和数字,打开中文会报错因为解不了中文)
# 那么就加个errors = ‘ignore’ 这样就会忽略错误,直接跳过中文部分
print(f.read())

输出为:

adafsd
asdfasdfd
sadfdsfds
sdafdsf


hello

以上是关于26.Python文件I/Oos模块&shutil模块详解的主要内容,如果未能解决你的问题,请参考以下文章

2018-06-26-Python全栈开发day22-part1-os,json,sys,pickle,shelve模块介绍

26 python 中deque模块详解

sh 删除git子模块但保留文件

去除 .sh 文件的

[sh]basename&dirname截取路径和文件名&case参数选项

shell 练习