Python基础-文件处理
文件基本概念
- python中文件是对象
- Linux文件:一切设备都可以看成文件,磁盘文件,管道,网络Socke,外设等
文件属性:用户/用户组,读/写/执行权限,大小,创建时间,文件名
-rw-rw-r–
rw-代表当前用户权限,接下来的rw-代表当前的用户组,其它用户组
ls -l -l
chmod +x hello.py
ls -l
文件打开方式
文件打开方法:open(name[,mode[buf]])
name:文件路径
mode:打开模式/方式
buf: 缓冲buffering大小
ls
f=open("hel.py")
type(f) #file
##文件打开模式
mode 说明 注意
'r' 只读方式打开 文件必须存在
'w' 只写方式打开 不存在则创建/存在则清空文件内容
'a' 追加方式打开 不存在则创建
'r+'/'w+' 读写方式打开
'a+' 追加和读写方式打开
'rb','wb','ab','rb+','wb+','ab+' 以二进制方式打开
f=open('a.txt','w')
f.write('aaaa')
f.close()
cat a.txt
f=open('a.txt','a')
f.write('bbb')
f.close()
cat a.txt
文件读写操作
文件读取方式:
- read([size])读取size个字节,默认读取全部
- readline([size]):读取一行,最多读取返回max(size,len(行内容))
- readlines([size]):读取完文件,返回每一行所组成的列表,size表示size个缓冲区长度
f=open('hello.txt',)
cat hello.txt
f.readline()
f.readline(100)
f.readline(2)
f.readlines(1)
- iter:使用迭代器读取文件,好处是不是全部读取文件,不使用大量内存的情况下完成整个文件的读取操作,每次自动读取一行内容
f=open('hello.txt')
iter_f=iter(f)
lines=0
for line in iter_f:
lines +=1
print lines
文件写入方式:
- write(str):将字符串写入文件
- writelines(sequence_of_strings):写多行到文件,参数为可迭代的对象(可以是字符串,字符串列表,字符串元组)
f=open('bb.txt','w')
f.write('bbbb')
f.close()
f=open('bb.txt','w')
f.writelines('bbbb')
f.writelines(('1','2'))
f.close()
- 1.文件写入时先保存在文件缓冲区中时,只有在文件关闭close()和flush刷新时才会保存写到磁盘中。
f=open('bb.txt','w')
f.writelines('bbbb')
f.writelines(('1','2'))
cat bb.txt
f.flush()
cat bb.txt
f.close()
- 2.写入数据量大于或者等于写缓存,写缓存区的内容才会同步到磁盘中。
f=open('bb.txt','w')
for i in range(10000):
f.write('test test write'+str(i)+'\n')
ls -l bb.txt
cat bb.txt
f.close()
ls -l bb.txt
文件的关闭
文件的关闭作用:
- 将写缓存同步到磁盘
- Linux系统中每个进程打开文件的个数是有限的
- 如果打开文件数到了系统限制,再打开文件就会失败
模拟打开文件失败的例子
ps
cat /proc/20384/
cat /proc/20384/limits #查看对该进程的限制,文件限制为
file.fileno() #文件
for i in range(1025)
f=open('11.txt','w')
print "%d: %d"%(i,f.fileno())
list_f=[]
for i in range(1025)
list_f.append(open('11.txt','w'))
print "%d: %d"%(i,list_f[i].fileno())
# 打开太多文件会报失败。
文件指针
文件读取写入文件指针移动过程:打开时默认在起始位置,read(3)会往后移动3个位置
seek(offset[,whence]): 移动文件指针
offset:偏移量,可以为负数
whence: 偏移相对位置,有三种方式:
- os.SEEK_SET:相对文件起始位置
- os.SEEK_CUR:相对文件当前位置
- os.SEEK_END:相对文件结尾位置
#文件22.txt 内容:0123456789abcdef
f=open('22.txt','r+')
import os
f.tell() #返回当前文件的偏移
f.read(3) #012
f.tell() #3
f.seek(0,os.SEEK_SET)
f.tell() #0
f.read(3) #012
f.seek(0,os.SEEK_END)
f.tell() #16
f.read() #返回空
f.seek(-5,os.SEEK_CUR)
f.tell() #11
f.read() #
#文件的偏移大于文件的尾部时会出错:
f.seek(0,os.SEEK_END)
f.tell()
f.seek(-17,os.SEEK_CUR) #报错IOError
文件属性/文件处理
-
文件对象属性
file.fileno():文件描述符
file.mode:文件打开权限
file.encoding :文件编码格式
file.closed:文件是否关闭 -
标准文件:
sys.stdin 文件标准输入
sys.stdout 文件标准输出
sys.stderr 文件标准错误
import sys
type(sys.stdin) #file
sys.stdin.mode # 'r'
sys.stdin.fileno() #0
sys.stdout.mode # 'w'
sys.stdout.fileno() #1
sys.stderr.mode # 'w'
sys.stderr.fileno() #2
- 文件命令行参数:
执行程序文件时根据参数不同完成不同功能。
sys模块提供sys.argv属性,通过该属性可以得到命令行参数
sys.argv : 字符串组成的列表;其中第一个参数为文件名
vi arg.py
#arg.py
if __name__=='__main__':
print len(sys.argv)
for arg in sys.argv:
print arg
- 文件编码格式
使用普通模式写入一个文件,写u’中文’时会报错编码格式不对时,应该将内容unicode转码为utf-8再写入文件
a=unicode.encode(u’中文’,‘utf-8’)
a
如何创建一个utf-8或者其它编码格式的文件?
使用 codecs模块提供方法创建指定编码格式文件
codecs.open(fname,mode,encoding,errors,buffering)用指定编码格式打开文件
help(codecs.open)
f=codecs.open('12.txt','w',encoding='utf-8')
Linux文件系统简介
文件包括:磁盘(ext2,ext4)文件,NFS文件系统,各种外设(sd卡,USB设备)等;
Linux系统如何管理外设,为应用层提供统一接口?
System API
System Call --> 文件节点
虚拟文件系统
设备驱动
Kernel内核将所有外设统一封装为文件/虚拟文件系统,每个文件系统生成一个文件节点
磁盘 USB SD卡 Net …
如图:
python 操作文件流程:
得到文件对象
打开文件,得到文件描述符
对应文件驱动
硬件设备
OS模块对文件和目录操作
os.open(filename,flag[,mode]) 打开文件
flag:打开文件方式:
- os.O_CREAT:创建文件
- os.O_RDONLY:只读方式打开
- os.O_WRONLY:只写方式打开
- os.O_RDWR:读写方式打开
os.read(filename,buffering) 读取文件
os.write(fd,string) 写入文件
os.lseek(fd,pos,how) 文件指针操作
os.close(fd):关闭文件
import os
fd=os.open('abc.txt',os.O_CREAT|os.O_RDWR)
ls -l
n= os.write(fd,'writetxt')
l=os.lseek(fd,0,os.SEEK_SET) #l值为0
str1=os.read(rd,5)
os.close(fd)
os模块介绍:如图
os.path模块方法介绍
文件练习
使用python管理ini文件:实现查询,添加,删除,保存
练习目的:
1、掌握文件基本操作
2、认识ini文件
3、了解 ConfigParser;
ini 配置文件格式:
节:[section]
参数:(键=值) name=value
例子:
#文件123.ini
[CRM]
type=9250
info=123456
import ConfigParser
cfg=ConfigParser.ConfigParser() #对象
cfg.read('123.ini')
cfg.sections()
for se in cfg.sections():
print se
print cfg.items(se)
cfg.set('CRM','type','321')
cfg.set('CRM','type1','222')
cfg.remove_option('CRM','type1')
import os
import os.path
import ConfigParser
class student_info(object):
def __init__(self,recordfile):
self.logfile = recordfile
self.cfg = ConfigParser.ConfigParser()
def cfg_load(self):
self.cfg.read(self,logfile)
def cfg_dump(self):
se_list = self.cfg.sections()
for se in se_list:
print se
print self.cfg.items(se)
def delete_item(self,section,key):
self.cfg.remove_option(section,key)
def delete_section(self,section):
self.cfg.remove_section(section)
def add_section(self,section):
self.cfg.add_section(section)
def set_item(self,section,key,value):
self.cfg.set(section,key,value)
def save(self):
fp = open(self.logfile,'w')
self.cfg.write(fp)
fp.close()
if __name__=='__main__':
info = student_info('123.txt')
info.cfg_load()
info.cfg_dump()
info.set_item('CRM','type','321')
info.cfg_dump()
info.add_section('info')
info.set_item('info','type','321')
info.cfg_dump()
info.save()
```