Python之路(第十八篇)shutil 模块、zipfile模块、configparser模块
一、shutil 模块
1、shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中,需要打开文件
import shutil
shutil.copyfileobj(open("old_test.txt","r"),open("new_test.txt","w"))
输出结果
2、shutil.copyfile(src,dst)
复制文件内容到另外一个文件,不需要打开文件,事实上,copyfile调用了copyfileobj
import shutil
shutil.copyfile("old_test.txt","new.txt")
输出结果
3、shutil.copymode(src,dst)
仅copy权限,不更改文件内容,组和用户。
import shutil
shutil.copymode("old_test.txt","new.txt")
输出结果
4、shutil.copystat(src, dst)
仅拷贝权限。内容、组、用户均不变
import shutil
shutil.copystat("old_test.txt","new.txt")
输出结果
5、shutil.copy(src, dst)
拷贝文件和权限
import shutil
shutil.copy("old_test.txt","new.txt")
输出结果
6、shutil.copy2(src, dst)
拷贝文件和状态信息
import shutil
shutil.copy2("old_test.txt","new.txt")
输出结果
7、shutil.copytree(src, dst, symlinks=False, ignore=None)
shutil.copytree
递归的去拷贝文件夹,要对写入的目录有写权限
例子
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('__init__.py', 'tmp*'))
#shutil.ignore_patterns(*patterns) #ignore代表排除
输出结果
8、shutil.rmtree(path[, ignore_errors[, onerror]])
递归的去删除文件
shutil.rmtree('folder1')
9、shutil.move(src, dst)
递归的去移动文件,它类似mv命令,其实就是重命名。dst可以是文件名也可以是目录,目标文件存在则覆盖。
shutil.move('folder1', 'folder3')
例子
import shutil
shutil.move("a","temp")
输出结果
10、shutil.make_archive(base_name, format,...)
创建压缩包并返回文件路径,例如:zip、tar
创建压缩包并返回文件路径,例如:zip、tar
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要压缩的文件夹路径(默认当前目录),将哪个目录或者文件打包(也就是源文件)
owner: 用户,默认当前用户
group: 组,默认当前组
logger: 用于记录日志,通常是logging.Logger对象
例子
import shutil
shutil.make_archive("test_package_bak","zip","test_package")
#对文件夹下的test_package文件夹进行打包
输出结果
11、shutil.unpack_archive()
解压,可指定解压目录,否则默认解压到当前工作目录。
shutil.unpack_archive(filename=hh, extract_dir=local_dir)
例子
import shutil
shutil.unpack_archive("test_package_bak.zip",extract_dir=r"D:\t1")
输出结果
二、zipfile模块压缩&解压缩
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:zipfile压缩&解压缩,tarfile压缩&解压缩
简单压缩例子
zipfile.ZipFile(fileName[, mode[, compression[, allowZip64]]])
参数说明
- fileName:压缩后的文件名,
- mode和一般的文件操作一样,'r'表示打开一个存在的只读ZIP文件;'w'表示清空并打开一个只写的ZIP文件,或创建一个只写的ZIP文件;'a'表示打开一个ZIP文件,并添加内容。
- compression表示压缩格式,可选的压缩格式只有2个:ZIP_STORE;ZIP_DEFLATED。ZIP_STORE是默认的,表示不压缩;ZIP_DEFLATED表示压缩(即有压缩率)
- allowZip64为True时,表示支持64位的压缩,一般而言,在所压缩的文件大于2G时,会用到这个选项;默认情况下,该值为False,因为Unix系统不支持。
f.write(f(filename[,arcname[,compression_type]])
将文件写入zip文件中,即将文件压缩
将zip外的文件filename写入到名为arcname的子文件中(当然arcname也是带有相对zip包的路径的),compression_type指定了压缩格式,也是ZIP_STORED或ZIP_DEFLATED。f的打开方式一定要是w或者a才能顺利写入文件。
压缩例子
import zipfile
f = zipfile.ZipFile("test.zip",mode="w",compression=zipfile.ZIP_DEFLATED)
f.write("old_test.txt") #也可以写文件完整路径名
f.write("test.py")
f.close()
print(f.namelist()) #查看压缩包文件列表,f是ZipFile实例化出来的对象,这里调用namelist()方法
输出结果
['old_test.txt', 'test.py']
有两个方法比较类似,注意区分。
f.write
指的是将已经存在的文件复制到压缩包,包括路径中的所有文件夹河其下的文件。f.writestr
是直接在压缩包里新建文件夹和文件,data
参数是往该文件中写入的内容。
解压例子
f.extract(member[,path[,pwd]])从zip中提取一个文件,将它放到指定的path下,pwd是密码,用于被加密的zip文件,member是要提取的文件名
f.extractall(path[,pwd]) 将所有文件按照namelist中显示得那样的目录结构从当前zip中提取出来并放到path下。
path解压缩目录 ,password当zip文件有密码时需要该选项
例子
import zipfile
f = zipfile.ZipFile("test_package.zip",mode="r") #注意此时解压不要用"w"格式,用"w"格式将清空压缩包文件
f.extractall(path=r"d:\testaaa") #将压缩包解压到d:\testaaa下
f.extract("old_test.txt") #提取压缩包中的一个文件到当前目录
f.close()
输出结果
高级应用
zipfile.is_zipfile(filename) 判断一个文件是不是压缩文件
ZipFile.namelist() 返回文件列表
例子
import zipfile
f = zipfile.ZipFile("test_package.zip",mode="r") #注意此时解压不要用"w"格式,用"w"格式将清空压缩包文件
print(f.namelist())
print(zipfile.is_zipfile("test_package.zip"))
注意此时解压不要用"w"格式,用"w"格式将清空压缩包文件
输出结果
['encode_decode问题.py', 'new_test.txt', 'old_test.txt', 'test.py', 'test.xml', 'test1.py', 'test2.py', 'test3.py', 'test6.py', 'testxml.xml', '客户端1.py', '服务端.py']
True
三、configparser模块
configparse模块用于生成和修改,解析(读取分析,获得数据)常见配置文档,多数此类配置文件名格式为XXX.ini,例如mysql的配置文件。
当前模块的名称在 python 3.x 版本中变更为 configparser。(python2首字母大写)
配置文件示例说明
##### ini 文件示例 ######## [section1]
name = nicholas
age = 18 [section2]
name:python
age = 19 #### 文件格式说明 #########
[XXX] 代表节点
XX = XX 或者 XX : XX 代表参数
#支持的两种分隔符“=”, “:”
例子
配置文件内容
文件名"test.ini"
文件内容
[DEFAULT]
default_mykey=myvalue
[Section_a]
Keya1=valuea1
Keya2=valuea2
Keya3=valuea3
[Section_b]
keyb1=valueb1
keyb2=valueb2
keyb3=valueb3
[Db]
db_host=127.0.0.1
db_port=5432
db_user=admin
db_pass=Letmein
db_name=test
db_url = jdbc:postgresql://%(db_host)s:%(db_port)s/%(db_name)s
python文件操作
import configparser
con = configparser.ConfigParser() #实例化创建一个对象
con.read("test.ini") #调用对象的read方法读取配置文件
print(con.sections()) #获取所有节点名称,默认不显示DEFAULT
# 输出结果 ['Section_a', 'Section_b', 'Db']
print(con.options('Section_a')) #获取指定节点的所有key
# 输出结果 ['keya1', 'keya2', 'keya3', 'default_mykey']
# 注意在处理键值对数据时,会将键名 全部转化为小写,同时自动加上默认的节点键值
print(con.items('Section_a')) #获取指定节点的键值对
#输出结果 [('default_mykey', 'myvalue'), ('keya1', 'valuea1'), ('keya2', 'valuea2'), ('keya3', 'valuea3')]
# 这里输出结果也是自动加上默认的键值对
print(con.get('Section_a',"keya1")) #获取指定节点的指定key的value
# 输出结果 valuea1
print(con.getint("Db","db_port")) #获取节点section1的age属性,属性需要是int型,否则ValueError
# 输出结果 5432
print(con.has_section("section")) #检查指定节点是否存在,返回True或False
# 输出结果 False
print(con.has_option("Section_a","keya1")) #检查指定节点中是否存在某个key,返回True或False
# 输出结果 True
# 循环查找节点中的key
for i in con["Section_a"]:
print(i)
# 通过字典的形式取值
data = con["Section_a"]["keya1"]
print(data)
# 输出结果 valuea1
# 判断节点在不在对象里
print("Section_a" in con)
# 输出结果 True
其它增删改查语法
import configparser
con = configparser.ConfigParser() #实例化创建一个对象
con.read("test.ini") #调用对象的read方法读取配置文件
con.add_section("new_section") #添加一个节点,节点名为new_section, 此时添加的节点尚未写入文件,
# 需要write方法写入文件
con.remove_section("Section_b") #删除一个节点,节点名为Section_b, 删掉了内存中的节点,
# 但文件中的还没删除,需要write方法删除,也有remove_option
con.set("Section_a", "k1", "v1") # 在已存在的节点中添加一个键值对k1 = v1 ,
# 如果该节点不存在则报错,如果key已经存在,则修改value,这里也需要
#有 write方法对文件进行操作
con.write(open("test.ini", "w")) #将修改写入文件
输出结果
补充remove_option(section, option)
从指定的节点中删除指定的选项。如果该部分不存在,请提出NoSectionError。如果存在的选项被删除,返回True;否则返回False。
Python之路(第十八篇)shutil 模块、zipfile模块、configparser模块的更多相关文章
- Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类
一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...
- Python之路【第八篇】:堡垒机实例以及数据库操作
Python之路[第八篇]:堡垒机实例以及数据库操作 堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient ...
- Python之路【第八篇】:Python模块
阅读目录 一.模块和包 模块(module)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到 ...
- Python之路(第十五篇)sys模块、json模块、pickle模块、shelve模块
一.sys模块 1.sys.argv 命令行参数List,第一个元素是程序本身路径 2.sys.exit(n) 退出程序,正常退出时exit(0) 3.sys.version . sys.maxint ...
- Python之路(第十二篇)程序解耦、模块介绍\导入\安装、包
一.程序解耦 解耦总的一句话来说,减少依赖,抽象业务和逻辑,让各个功能实现独立. 直观理解“解耦”,就是我可以替换某个模块,对原来系统的功能不造成影响.是两个东西原来互相影响,现在让他们独立发展:核心 ...
- Python之路【第二十八篇】:django视图层、模块层
1.视图函数 文件在view_demo 一个视图函数简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XM ...
- Python开发【第十八篇】Web框架之Django【基础篇】
一.简介 Python下有许多款不同的 Web 框架,Django 是重量级选手中最有代表性的一位,许多成功的网站和APP都基于 Django. Django 是一个开放源代码的Web应用框架,由 P ...
- Python之路【第八篇】:面向对象的程序设计
阅读目录 一 面向对象的程序设计的由来二 什么是面向对象的程序设计及为什么要有它三 类和对象3.1 什么是对象,什么是类3.2 类相关知识3.3 对象相关知识3.4 对象之间的交互3.5 类名称空间与 ...
- Python自动化 【第十八篇】:JavaScript 正则表达式及Django初识
本节内容 JavaScript 正则表达式 Django初识 正则表达式 1.定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m ...
随机推荐
- .net 中使用oracle 的sql 语句
string sqlString = "Select * From emp Where EMPNO=7369“; 一定不要写成 string sqlString = "Selec ...
- linux安装zookeeper及使用
一.安装条件 想要安装zookeeper,必须先在linux中安装好jdk.安装步骤见: https://www.cnblogs.com/expiator/p/9987351.html 二.下载并解压 ...
- poj2635(千进制取模+同余模定理)
题目链接:https://www.cnblogs.com/kuangbin/archive/2012/04/01/2429463.html 题意:给出大数s (s<=10100) ,L (< ...
- 第四章 栈与队列(d)队列接口与实现
- CentOS 7 单用户模式+救援模式
CentOS 7 单用户模式+救援模式 CentOS 7 单用户模式+救援模式.有时候大家可能会忘记自己的root密码,或者错误(命令输入错误,命令位置输入有误等)编辑了一个/etc目录下的核心文件导 ...
- JAVA去重
JAVA中去掉空格 1. String.trim() trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间 ...
- .NET通用工具——正则表达式
正则表达式就是一组字符串运算规则,你需要先把元字符记熟,然后就可以随意组合获得你想要的结果.把一些常用的正则表达式背下来也是一种方法,再加以变化获得你想要的结果. 正则表达式不需要刻意的去学习,当用到 ...
- eclipse导入项目以后,内容没有错误,项目上却有个小红叉?
对于上面的错误,应该如何解决?
- 面试题集锦;有关作用域和this的指向
作用域面试题: 1. fn() function fn () { console.log(12) } var as = function () { console.log(45) } 2. var a ...
- 10.9h5日记
一.单位 1.px是基本的单位,像素 2.em也是一个单位,使用方式,用元素父级的字体大小乘以em前的数字,父级没有就向上一个父级找, 直到body为止,如果body没有,就用默认的字体大小16px ...