chapter6.3、shutil模块的使用,csv,ini,及configparser模块
os模块
os.name
返回操作系统平台,windows下是nt,Linux下数是posix
os,uname,Windows下不支持uname,Linux下返回posix.uname_result(sysname='Linux', nodename='centos', release='2.6.32-696.el6.x86_64', version='#1 SMP Tue Mar 21 19:29:05 UTC 2017', machine='x86_64')
sys.platform windows返回win32,linux返回linux
os.listdir ,立即返会一个目录内内容的列表
python3中鼓励使用生成器
os调用底层函数,建议使用内建函数open、read、write
os.stat(),本质调用系统功能,linux下的stat,显示文件的元信息
os.chmod,改变权限,改变权限需要权限,改权限谨慎,删文件谨慎。
linux系统操作掌握,可以看视屏学学习
shutil 高级文件操作
文件拷贝时拷贝内容,但是会丢失stat数据信息,权限等,python提供了库shutil
shutil.copy 复制file和mode
shutil.copyfileobj(fsrc,fdst[,length]) 文件对象的复制,不复制fsrc和fdst是open的打开的文件对象,复制内容,fdsr要求可写,length指定buffer的大小。
shutil.copyfile(src,dst,*,follow_symlinks=True) 复制文件内容,参数是字符类型,不含元数据,本质上就是调用copyfileobj ,所以不带元数据,二进制复制内容,比较文件的存在,和软链接判断,类型判断,follow_symlinks=True 判断软链接,True表示追进
shutil.copymode(src,dst,*,follow_symlinks=True),复制权限。
shutil.copy2 拷贝文件文件的stat,mode,file,参数是字符串表示的路径
shutil.copystat 拷贝stat信息,时间信息
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)
拷贝结构树,要注意是递归复制,目标文件不能存在,ignore后是一个函数,例如
def ingnore(src,names): ignoreanmes = set() for name in names: if name.endswith('.py'): ignoreanmes.add(name) return ignoreanmes shutil.copytree('/tmp/b','/tmp/a',ignore=ingnore)
表示忽略以a开头的文件,
shutil.rmtree(path, ignore_errors=False, onerror=None) 递归删除,和rm-rf 一样危险,慎用,不是原子操作,删除错误时,会中断,删除的无法还原
ignore_errors=False 表示忽略错误,为False或omitted时onerror生效,onerror为callable,接受函数function,path,execinfo
shutil.move(src, dst, copy_function=copy2),递归移动文件和目录到目标,本身使用的是os.rename 的方法,如果不能rename,就调用copytree后删除源目录,没有确认复制完成时,不会删除源。默认使用copy2的方法。Windows下,相同盘符下改目录,不同盘符下,先复制再删除,错误时不删除源文件。
shutil还有打包功能,生成tar并压缩,支持zip、gz、bz、xz。
rar闭源的,压缩时使用zip压缩,zip是开源的。
csv文件,逗号分割值的文本文件,Comma-Separated Values。
文档位置 :http://www.ietf.org/rfc/rfc4180.txt
行列分割符分成行和列的文本文件,csv不指定编码列分割符常用,或制表符,行用\r\n
一行记录一条recode,字段可以使用双引号括起来,也可以不使用。如果字段中出现了双引号、逗号、换行符必须使用双引号括起来。如果字段的值是双引号,使用两个双引号表示一个转义。
表头可选,和字段列对齐就行。
import csv 导入csv模块,
csv.reader(iterable [, dialect='excel'][optional keyword args]) 返回一个行迭代器
dialect,方言:默认使用excel方言,如下:
delimiter 列分隔符,逗号
lineterminator 行分隔符\r\n
quotechar 字段的引用符号,缺省为" 双引号
双引号的处理
doublequote 双引号的处理,默认为True。如果碰到数据中有双引号,而quotechar也是双引号,True则使用2个双引号表示,False表示使用转义字符将作为双引号的前缀
escapechar 一个转义字符,默认为None,不给抛异常
writer = csv.writer(f, doublequote=False, escapechar='@') 遇到双引号,则必须提供转义字符,此处转为@符号,如果使用转义字符,要再加一个反斜杠。
quoting 指定双引号的规则
QUOTE_ALL 所有字段
QUOTE_MINIMAL特殊字符字段,Excel方言使用该规则
QUOTE_NONNUMERIC非数字字段,加双引号
QUOTE_NONE都不使用引号。最好少用,无法对齐
excel还有一种excel_tab 方言,使用tab作为列分割符。
csv_read = reader(iterable [, dialect='excel'][optional keyword args]) for x in csv_reader: print(x)
csv_writer = csv.writer(fileobj [, dialect='excel'] [optional keyword args]) 返回DictWriter的实例
csv_writer.writerows(rows)
writerow,迭代每一行,用逗号分割,有歧义加引号
writerows,迭代写入表格,行尾使用\n分割,windows下在每行末尾加\n,使用newline=‘’解决。
ini 文件
配置文件,
中括号里面的部分称为section:节,区,段
每个section中都是kv对
配置文件都是文本文件,文件内都是字符类型,没有其他类型
python中要求kv对都在section中,python要求必须有第一行的缺省值
DEFAULT是缺省section的名字,必须大写,其他section没有时,default值顶上。
可以理解为嵌套字典,可以将section当做key,section存储着键值对组成的字典,可以把ini配置文件当做一个嵌套的字典。默认使用的是有序字典。
configparser模块
configparser模块的ConfigParser类就是用来操作。
可以将section当做key,section存储着键值对组成的字典,可以把ini配置文件当做一个嵌套的字典。默认使用的
是有序字典。
read(filenames, encoding=None)读取ini文件,可以是单个文件,也可以是文件列表。可以指定文件编码。
sections() 返回section列表。缺省section不包括在内。
add_section(section_name) 增加一个section。
has_section(section_name) 判断section是否存在
options(section) 返回section的所有option,会追加缺省section的option
has_option(section, option) 判断section是否存在这个option
get(section, option, *, raw=False, vars=None[, fallback])从指定的段的选项上取值,如果找到返回,如果没有找到就去找DEFAULT段有没有。
getint(section, option, *, raw=False, vars=None[, fallback])
getfloat(section, option, *, raw=False, vars=None[, fallback])
getboolean(section, option, *, raw=False, vars=None[, fallback])
上面3个方法和get一样,返回指定类型数据。
items(raw=False, vars=None) 返回ini文件的section和sections的内容的kv对
items(section, raw=False, vars=None)没有section,则返回所有section名字及其对象;如果指定section,则返回这个指定的section的键值对组成二元组。
set(section, option, value)
section存在的情况下,写入option=value,要求option、value必须是字符串。
remove_section(section)移除section及其所有option
remove_option(section, option)移除section下的option。
write(fileobject, space_around_delimiters=True)将当前config的所有内容写入fileobject中,一般open函数使用w模式。