在磁盘上读写文件的功能都是由操做系统提供的,现代操做系统不容许普通的程序直接操做磁盘,因此,读写文件就是请求操做系统打开一个文件对象(一般称为文件描述符),而后,经过操做系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
文件是计算机中由OS管理的具备名字的存储区域,在Linux中,文件是被看作字节序列.python
open(文件目录(能够是绝对路径和相对路径)[文件打开模式][文件输出缓存])
后面两项是可选参数。默认返回是一个文件对象的内存,其默认的读写模式是只读模式,mysql
能够经过赋值进行输出结果read(输出的字节数)默认是所有
经过参数指定读取的范围:redis
A seek([文件偏移量][文件指针位置])
文件指针的返回
为0表示文件的起始,为1 表示当前位置,为2表示末尾位置。
经过指定文件的指针能够重复读取文件的第一行内容,sql
偏移量的大小表现为文件的字节数,当为正时,表示向右读取,当为负时,表示向左读取,当为0时,表示不偏移shell
B tell()显示指针目前所处位置
C close()表示关闭当前文件
D closed 检查当前文件是否关闭,若为True ,则表示已关闭,若为False,则表示未关闭
E name 查看文件名称
F mode 查看当前文件的打开模式
G flush 将当前文件的内容刷新到磁盘上,其目的是为了防止断电而保存。
H next() 用于读取文件内容,每次读取一行,其指针位置不发生变化数据库
A readline()每次读取一行文件内容
B readlines() 每次读取文件的全部内容
C read () 指定读取文件的字节数,默认是所有读取windows
A write()其能够写入字符串,
B writelins()用于传入多个参数缓存
编码:用一个字节表明什么,两个字节表明什么,
编码问题:
1 Windows的默认编码规则是cp936国标,cp936是GBK 的一种,GBK不是国际标准,GB2312是国际标准。
2 Linux的默认编码规则是utf-8,Unicode传输编码,其一个汉字是3个字节,偶尔多是4个字节,其总共占6个字节
Gbk 是 a0 开始的,在utf-8中不能识别
GBK 是顺序的中文编码,GBK是两个字节。utf-8大可能是3个字节,多是4个字节
换行符问题:网络
可以使用newline进行指定换行符,文本模式中,换行的转换能够为None,"",'\r','\n','\r\n'
读取时,None 标识'\r','\n','\r\n'都被转换为'\n', ""(空字符串)表示、
不会自动转换通用换行符,其余合法字符表示换行符就是指定字符,就会按照自定字符分行,从新定义分割符。socket写入时,None 表示"\n"都会被替换为系统缺省分割符os.linsep,'\n'或"" 表示"\n"不替换,其余合法字符表示
换行符"\n"都会被替换为指定分割符。
文件描述符:
默认的三种,0 标准输入, 1 标准输出, 2 错误输出
文件描述符可表示打开文件的数量,当打开文件数量达到系统打开文件数量上限时,则会报错
seek(offset[,whence])
offset默认是针对于起始位置开始,表示从头测试
文本模式下:
whence=0 缺省值,表示从头开始,offset只能接受正整数
whence=1 表示从当前位置开始,offset 只接受0
whence=2 表示从EOF 开始,offset 只接受0
二进制模式:
whence=0 缺省值,表示从头开始offset只能是正整数
whence=1 表示从当前位置开始,offset可正可负
whence=2 表示从EOF开始,offset可正可负
二进模式支持任意起点的偏移,从头,从尾,从中间位置开始向后seek能够超界,可是向前seek的时候,不能超界,不然会报异常。
size 表示读取多少个字符或字节,负数或None表示读取到EOF
流对象,字符序列,字节序列,网络流至没有边界 ,都指的是序列,
网络流:和时间有关,也是一个序列
文本流,字符流,
二进制流,字节流: 将文件就按照字节理解,与字符编码无关,二进制模式操做时,字节操做使用bytes类型
f=open('test2','wb') f.write("爱国".encode()) #此处使用字节输入,其默认编码是utf-8, print (f) f.close() f=open('test2') # 此处读取,默认编码是utf-8 print (f) print (f.read(1)) print (f.read(1)) f.close()
结果以下:
在Linux 中,执行
查看打开文件状况
因为打开文件未关闭,致使打开文件数过多,每次打开文件都会产生文件表述符,则致使问题,Linux默认的打开文件数量是1024,其因为未关闭而致使有如上报错。
解决方式1
经过异常处理进行关闭。
with open('test2') as f: f.write("zhongguo") print (f.closed)
结果以下
做用:用于将python与文件系统更加紧密链接的一种模块
os.Chdir() 改变目录/经过文件描述改变工做目录
os.chroot() 设定当前进程的根目录
os.listdir() 列出指定目录下的全部文件名
os.Mkdir()建立指定目录,默认为一级
os.makedirs('x/y/z')
os.getcwd()获取当前目录
os.Rmdir()删除目录
os.Removedirs() 删除多级目录
os.removedirs('/mnt/aaa/bbb/ccc') 必须制定全部的目录才能够删除
os.mkfifo() 建立先进先出管道(命名
os.mknod() :建立设备文件
os.Remove() 删除文件
os.Unlink( ) 删除连接
os.Rename() 文件重命名
os.rename('passwd','aaa')
os.Stat() 返回文件状态信息
os.Symlink() 建立文件连接,符号连接
In [33]: os.symlink('text2.txt','text2.syslink')
text2.syslink
os.utime() 更新文件的事件戳 updatetime
os.tmpfile() 建立并打开一个新的临时文件,打开模式是(w+b)
os.access() 检验权限模式
In [42]: os.access('/tmp/text2.txt',0) UID 管理员的访问权限
os.Out[42]: True
In [43]: os.access('/tmp/text2.txt',100) 普通用户的访问权限
Out[43]: False
os.Chmod() 修改权限
In [44]: os.chmod('text2.txt',0640) os.chmod('aaa',0777)为四位
os.Chwon 修改属主 ,属组
In [47]: os.chown('text2.txt',1000,1000)
[root@www tmp]# id admin
uid=1000(admin) gid=1000(admin) 组=1000(admin)
[root@www tmp]# ll text2.txt
-rw-r-----. 1 admin admin 2525 11月 19 20:35 text2.txt
os.Umask() 设置默认权限模式
os.Open():打开一个文件,底层操做系统的open
os.Read() 较低io的读取操做
os.Write() 较低IO的写操做
os.Mkdev() 根据指定的主设备号,次设备号建立文件
In [48]: help(os.makedev)
Help on built-in function makedev in module posix:makedev(...)
makedev(major, minor) -> device number
Composes a raw device number from the major and minor device numbers.
(END)
os.Major() 从指定的设备获取主设备号
os.Minor() 从指定的设备获取次设备号
1 os.system 用于python 与shell之间的交互命令,若是存在,则返回0,不然返回其余
os.popen(命令).read()
os.uname() 获取当前模块的详细信息
In [55]: import os.path
A.os.path.Basename():路径基名
In [58]: file1=os.path.basename('/etc/sysconfig/netw')
/etc/sysconfig/network /etc/sysconfig/network-scripts/B.os.path.irname() 路径目录名
C.os.path.join() 将路径基名和目录名整合成一个名字
In [60]: os.path.join(dir1,file1)
Out[60]: '/etc/sysconfig/network-scripts/'
In [63]: for filename in os.listdir('/tmp'):
....: print os.path.join('/tmp',filename)C. os.path.splist()分割文件名和文件,返回dir和basename()元组
In [64]: os.path.split('/etc/sysconfig/')
Out[64]: ('/etc/sysconfig', '')D os.path.Splitext() 返回(filename,extension) 元组
6]: os.path.splitext('/tmp/')
Out[86]: ('/tmp/', '')
A os.path.getatime() 返回文件最近一次的访问记录
B os.path.Getctime()
C os.path.Getmtime()
D os.path.Getsize() 返回文件的大小
A os.path.Exists() 判断指定文件是否存在,档不存在时,以只读方式打开文件是错误的。
B os.path.Isabs() 判断指定的路径是不是绝对路径
C os.path.isdir() 判断指定路径是否为目录
D os.path.Isfiel() 判断指定文件是否为文件
E os.path.Islink() 判断时否为符号连接
F os.patj.Ismount() 是否为挂载点
G os.path.Sanefiek() 两个路径是否执行了同一个文件
简介: 在内存中开辟一个文本模式的buffer,能够像文件同样操做它,当close方法被调用时,这个buffer被释放,此处没有持久化
1 StrinIO
#!/usr/local/bin/python3.6 #coding:utf-8 from io import StringIO sio=StringIO() sio.write("MySQL数据库") print (sio.readline(),1) # 此处因为指针在写入时的缘由,致使指针指在了最后,所以致使其读取不能完成 sio.seek(0) # 指针归零 print (sio.readline(),2) # 进行读取 print (sio.readline(),3) #因为指针到最后,所以致使其不能读取 print (sio.read(),4) #因为指针到最后,所以致使其不能读取 print (sio.getvalue(),5) # 此方法不会在意指针 sio.close() #文件关闭
查看显示结果
优势:通常来讲,磁盘操做比内存慢,内存足够的状况下,通常的优化思路是减小落地,减小磁盘IO的过程,能够大大提升程序的运行效率,单台机器可使用StringIO,多台设备之间使用redis来实现
2 BytesIO
#!/usr/local/bin/python3.6 #coding:utf-8 from io import BytesIO bio=BytesIO() bio.write("MYSQL数据库".encode('utf-8')) # 写入汉字须要指定编码格式 print (bio.getvalue()) # 读取数据,无论指针 bio.write(b'mysql database') bio.seek(0) print (bio.readline()) # 读取一行 bio.seek(0) print (bio.read()) bio.close()
结果以下
3 file-like 对象
类文件对象,能够像文件同样操做
from sys import stdout f=stdout print (type(f)) f.write('51cto.com') #直接输出到屏幕上
结果以下
3.4 版本开始,支持使用pathlib模块提供对Path对象的操做,包括文件和目录
p=Path() # 类初始化,初始化成实例
p.absolute() # 查看p的绝对路径
p # 查看p的路径,相对路径
p=p.joinpath('/etc','a','b','c') # 此处第一个如有/表示绝对路径,也表示从新建立路径,若此处无/ 则表示在p的当前路径下进行增长,及拼接
p=p /'c'/'d' # 对p进行增长路径'c'/'d',也成为路径拼接
p1=Path('/a','b','/c') # 若指定多个绝对路径,则之后面覆盖前面的路径
p1.parts # 返回一个元组,打印其跟和相对路径
p1.parent # 返回当前路径的父路径
p1.parent.parent #返回当前父路径的父路径,依次类推,但若不存在则会报错,所以不建议这样使用
list(p1.parents) # 此处返回一个可迭代对象,可用for循环进行遍历,并逐步取出其父路径,其父路径的父路径,依次类推
list(p2.absolute().parents) # 对于相对路径获取其父路径的方式
list(p2.absolute().parents)[0] # 获取其父路径
p3=Path('/etc/sysconfig/network/51.cfg')
p3.name # 获取目录的最后一部分,及51.cfg
p3.stem # 获取目录最后一部分的扩展名
p3.suffix # 获取目录最后一部分,没有扩展名
p4=Path('/etc/sysconfig/network/51.cfg.gz')
p4.suffix # 获取扩展名后缀 .gz
p4.suffixes # 返回多个扩展名列表 及 [.cfg,.gz]
p4=p4.with_suffix('.sz') # 修改扩展名后缀 结果为 /etc/sysconfig/network/51.cfg.sz
p4=p4.with_name('52.cfg.gz') # 修更名字,结果以下 /etc/sysconfig/network/52.cfg.gz
p.iterdir()
列出该目录下的文件,默认是一个生成器对象,其默认返回是一个PosixPath,其支持的方法有不少
l1[0].stat() 获取文件的基本信息
此处有获取其模式,硬连接,uid,gid,以及大小,日期等信息
此处有判断其类型,有块,字符,目录,管道,文件,socket等,其返回是一个布尔类型
此处使用stat 可获取如同Linux通常的权限列表
获取属主和属组
要求 实现ls命令功能
1 实现显示路径下的文件列表
2 -a 和-all 显示包含.开头的文件
3 -l 显示详细列表信息
4 -h和 -l 配合,人性化显示文件大小,如1k,1M,1G等
5 按照文件名排序输出,能够和ls的顺序不一样,但要求按照文件名进行排序
#!/usr/bin/poython3.6 #conding:utf-8 from pathlib import Path import datetime import stat import argparse def showDir(path:Path='.',all=False,lis=False,detailed=False): def _showSize(size:int): # 此处用于格式化文件大小 unit=" KMGTP" depth=0 while size>=1000: size=size //1000 depth+=1 return "{}{}".format(size,unit[depth]) def _showDir(path:Path='.',all=False,lis=False,detailed=False): p=Path(path) for file in p.iterdir(): if str(file.name).startswith('.') and not all:# 此处用于判断文件是否须要列出隐藏文件 continue if lis: #此处用于判断是否须要列出详细信息 st=file.stat() # 此处返回一个文件详细信息表 # -rw-r--r-- 1 root root 430 6月 3 14:02 char.py h=st.st_size if detailed: # 此处用于判断是否 h=_showSize(st.st_size) yield (stat.filemode(st.st_mode),st.st_nlink,file.owner(),file.group(),h, datetime.datetime.fromtimestamp(st.st_atime).strftime("%Y-%m-%d %H:%M:%S"), file.name) else: yield file.name yield from sorted(_showDir(args.path,args.all,args.l,args.h),key=lambda x:x[-1]) # 此处用于对文件最后文件名进行排序 # 此处用于定义参数, parsent=argparse.ArgumentParser(prog='ls',description='list file',add_help=False) # prog表示提示usage为ls,add_help为False表示取消默认的-h显示 parsent.add_argument('path',nargs='?',default='.',help="Incoming path information") #path 位置参数,nargs表示其参数的个数,'?'表示无关紧要,若无,则启用默认参数 parsent.add_argument('-a','--all',action='store_true') # action='store_true' 此处若不填,则后面有大写的选项参数 parsent.add_argument('-l',action='store_true',help='list file info') parsent.add_argument('-h',action='store_true',help='list file detailed') if __name__ == "__main__": args=parsent.parse_args(('/root','-lh')) for file in showDir(args.path,args.all,args.l,args.h): #此处的做用在于遍历 print (file)
结果以下
csv 是一个被行分隔符,列分隔符划分红行和列的文本文件,没有特定的字符编码,可压缩,大大节约空间
行分割符 \r \n ,最后一行能够没有换行符
列分割符经常用逗号或制表符进行处理
每一行成为一个record
字段可使用双括号括起来,也能够不使用,若是字段中出现了双引号,逗号,换行符必须使用双引号括起来,若是字典中的值是双引号,则使用功能两个双引号表示一个转义
reader(csvfile,dialect='excel',**fmtparams) # 返回DictReader 的实例,是个行迭代器
delimiter #列分割符 逗号
lineterminator # 行分割符 \r\n
quotechar # 字段的引用符号,缺省为双引号
双引号的处理:
doublequote 双引号的处理,默认为True,若是和quotechar为同一个,True则使用2个双引号表示,False表示转义字符将做为双引号的前缀
escapechar 一个转义字符,默认为None
quoting 指定双引号的规则,QUOTE_ALL 全部字段,QUOTE_MINIMAL 特殊字符字段
QUOTE_NONNUMERIC非数字字段,QUOTE_NONE 都不使用引号。writer(csvfile,dialect='excel',**fmtparams)
返回DictWriter的实例
主要方法有writerow,writerows
#!/usr/local/bin/python3.6 #coding:utf-8 from pathlib import Path import csv p=Path('/root/test.csv') if not p.parent.exists(): # 判断其父路径是否存在,若不存在,则建立 p.parent.mkdir(parents=True) #建立其父路径 line1=[1,2,3,4,576] with open(p,'w') as f: writer=csv.writer(f) #写入文件系统 writer.writerow(line1) #进行写入一行操做
结果以下
#!/usr/local/bin/python3.6 #coding:utf-8 from pathlib import Path import csv p=Path('/root/test.csv') if not p.parent.exists(): # 判断其父路径是否存在,若不存在,则建立 p.parent.mkdir(parents=True) #建立其父路径 line1=[1,2,3,4,576] line2=[10,22,'3',40,'576'] with open(p,'w') as f: writer=csv.writer(f) #写入文件系统 writer.writerow(line1) #进行写入一行操做 writer.writerow(line2) #写入下一行操做
写入结果以下
同时写入多行
#!/usr/local/bin/python3.6 #coding:utf-8 from pathlib import Path import csv p=Path('/root/test.csv') if not p.parent.exists(): # 判断其父路径是否存在,若不存在,则建立 p.parent.mkdir(parents=True) #建立其父路径 line1=[1,2,3,4,576] line2=[10,22,'3',40,'576'] line3=[line1,line2] with open(p,'w') as f: writer=csv.writer(f) #写入文件系统 writer.writerow(line1) #进行写入一行操做 writer.writerow(line2) #写入下一行操做 writer.writerows(line3) #同时写入多行操做
结果以下
读取操做
#!/usr/local/bin/python3.6 #coding:utf-8 from pathlib import Path import csv p=Path('/root/test.csv') if not p.parent.exists(): # 判断其父路径是否存在,若不存在,则建立 p.parent.mkdir(parents=True) #建立其父路径 line1=[1,2,3,4,576] line2=[10,22,'3',40,'576'] line3=[line1,line2] with open(p,'w') as f: writer=csv.writer(f) #写入文件系统 writer.writerow(line1) #进行写入一行操做 writer.writerow(line2) #写入下一行操做 writer.writerows(line3) #同时写入多行操做 with open(p) as f: reader=csv.reader(f) #因为其返回的是一个迭代器,所以可经过for循环方式进行读取操做 for line in reader: if line: #判断读取到的行是否存在 print (line)
结果以下
Dictreader 和 DictWriter 对象
使用 dictreader能够向操做字典那样获取数据,把表的第一行(通常是表头)做为key,可访问每一行中的那个key对应的数据
#!/usr/local/bin/python3.6 #coding:utf-8 import itertools import pymysql import csv filename='/root/test1.csv' with open(filename) as f: reader=csv.DictReader(f) for row in reader: max_tmp=row['passwd'],row['name'],row['createtime'] print (max_tmp)
结果以下
DictWriter 类,能够写入的字典形式的数据,一样键也是表头
#!/usr/local/bin/python3.6 #coding:utf-8 import csv headers=['name','age'] datas=[ {'name':'zhang1','age':25}, {'name': 'zhang2', 'age': 26}, {'name': 'zhang3', 'age': 27}, ] with open('/root/test2.csv','w+') as f: writer=csv.DictWriter(f,headers) # 写入表的形式 writer.writeheader() # 写入表头数据 for row in datas: writer.writerow(row) # 写入真实数据,逐条写入 writer.writerows(datas) # 写入真实数据,一次性写入
结果以下
.ini 文件时initalization file 的缩写,及就是初始化文件,是windows的系统配置文件所采用的存储格式,统一管理Windows的各项配置,通常用户就用Windows提供的各项图形化管理工具变可实现相同配置,现在的mysql依然采用这种方式实现配置文件的初始化操做。
格式
INI 文件由节(区域),键,值组成
节及就是 section 其中是由key=value的形式保存,key成为option选项
configparser 模块的ConfigParser类就是用来操做的
方法
read(filenames,encoding=None)
读取ini文件,能够是单个文件,也能够是文件列表,能够指定文件编码
optons(section) 返回section下的全部option
get(section,option,*,raw=False,vars=None[,fallback])
从指定的段的选项上取值,若是找到则返回,若是没找到,则取DEFAULT段中查找
getint(section,option,*,raw=False,vars=None[,fallback])
从指定的字段选项上取值,返回×××,至关于作了int() 进行转型,默认是str字符串类型
getfloat(section,option,*,raw=False,vars=None[,fallback])
同上
getboolean(section,option,*,raw=False,vars=None[,fallback])
同上 布尔类型
items(raw=False,vars=None) #对全部进行遍历,返回键值对,不指定段,默认返回全部段中的key和value的值,若中途存在相同的key=value再不一样的段中出现,则可能发生冲突,建议使用下面的方式进行处理
items(section,raw=False,vars=None) # 指定返回段的key和value
sections()返回section列表,缺省section不包括在内[DEFAULT]
has_section(section_name) 判断section是否存在
has_option(section,option) 判断section 是否存在这个option
add_section(section_name) 增长一个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的全部内容写入到flieobject中,一盘open函数使用w模式。
1 基本读取
#!/usr/local/bin/python3.6 #coding:utf-8 from configparser import ConfigParser cfg=ConfigParser() # 初始化操做 cfg.read('/etc/my.cnf') # 读取文件内容 print (cfg.sections()) # 打印其区,并返回列表 for sections in cfg.sections(): #遍历section for opt in cfg.options(sections): # 遍历其中的值 print (sections,opt) # 打印section和option for i in cfg.items('mysqld'): #指定section,返回其下面的key和value,以元组的方式返回 print (i)
结果以下
2 写入和移除
#!/usr/local/bin/python3.6 #coding:utf-8 from configparser import ConfigParser from pathlib import Path p=Path('/root/my.cnf') # 定义一个文件 parent=p.parent # 获取其父目录 if not parent.exists(): # 判断其父目录是否存在。若不存在则建立 parent.mkdir(parent=True) with open(p,'w+') as f: # 以写的方式建立父目录 f.write("") cfg=ConfigParser() # 定义初始化 cfg.read('/root/my.cnf') # 定义读取 if not cfg.has_section('test'): # 查看section是否存在,若不存在,则建立 cfg.add_section('test') if not cfg.has_option('test','test1'): #查看test下的test1是否存在,若不存在,则建立 cfg.set('test','test1','2')#其value必须是字符串 with open(p, 'w') as f: cfg.write(f) # 将数据持久化存储至文件中 print (cfg.items('test')) # 查看 print (type(cfg.get('test','test1')),cfg.get('test','test1')) # 获取key对应的value print (type(cfg.getint('test','test1')),cfg.getint('test','test1')+1) # 获取key对应的value,并以×××输出 cfg.remove_option('test','test1') #移除其中的key和value print (cfg.sections()) cfg.remove_section('test') #移除这个段 print (cfg.sections())
查看结果