文件的读写操作

文件的读取:

#文件的读操作的方法:
#(1)readline读取一行,如果设置了读取的字节数,设备的字节数>一行的字节数时,会把一行的数据全部读出,若小于则只读取设置的字节数的大小
#(2)read方法默认读取全部,若设置了size则读取size字节
#(3)readlines 是读取buff的里差不多的大小,返回每一行所组成的列表,这里的size不管取多大,都是返回DEFAULT_BUFFER_SIZE差不多大小的值
#(4)使用iter迭代器来读取全部文件
f=open('/Users/mac/Desktop/test.rtf')
也可以用with open打开,它相当于try...finally,且不用调f.close(),
with open('/Users/mac/Desktop/test.rtf','r') as f:
	print(f.read())

print f.readline()
print f.readline(100) #读取一行
print f.readline(2)  #只读取两2个字节
#使用readlines步骤:1,查看DEFAULT_BUFFER_SIZE模块8192。
# 2.追加test.rtf文件的内容,加到1000行,查看文件的大小ls -l test.rtf,得到大小是10890。大于DEFAULT_BUFFER_SIZE
# 3.再次重新打开文件,查看读取的行数, 是否将1000行全部读出,只读出755行
list_c=f.readlines(1)
print list_c
print len(list_c)  #返回755行,计算一下总的字节数:每行是11*755=8305与8192差不多字节,不管readlines(2)size的大小是多少
#查看DEFAULT_BUFFER_SIZE模块
import io
print io.DEFAULT_BUFFER_SIZE  #返回值是8192

f.close()

#4.使用迭代器取全部文件,使用迭代器的好处是:它是把文件内容全部放在迭代器中,而不是放在内存中。当我们调用next方法时,才会把迭代器中的一条
#条内容放到内存中。故只要遍历读取迭代器的内容,就会遍历一条条写入到内存中。不消耗内存
f=f=open('/Users/mac/Desktop/test.rtf')
iter_f=iter(f)
lines=0
for line in iter_f:
    lines +=1
    print line
print lines #读出1000行

文件的写入:
#文件的写操作的方法:
#(1)write(str):将字符串写入文件
#(2)writelines(sequence of string):写入多行,参数为可迭代对象,包括字符串,字符串组成的元组,字符串组成的列表,字符串组成的迭代器
#文件的写操作出现的问题:(1)文件写入有个缓存机制,如果文件的长度<这个文件的缓存的size,它会先放在缓存中,调用close或者flush函数才会写入到磁盘
# (2)当写入的文件>这个文件的系统缓存,它会先把写满缓存的同时写入磁盘,这个时候查看文件已经写入了,不用调用close或者flush方法
#      缓存腾出来存剩下的。这个剩下的要调用close或者flush函数才可以写入到磁盘
#方法1: write方法
f=open('/Users/mac/Desktop/test.rtf','w')
f.write('jolingtest')
f.close()
r=open('/Users/mac/Desktop/test.rtf')
print r.read()
#方法2:writelines方法
f=open('/Users/mac/Desktop/test.rtf','w')
# f.writelines((1,2,3)) #报错,因为参数不是字符串组成的元组
f.writelines(('1','2','3')) #成功写入
f.writelines(['1','2','3']) #成功写入
f.close()
# 写缓存,当写入数据量<缓存,则要调用close 和 flush来将缓存写入到磁盘
f=open('/Users/mac/Desktop/test.rtf','w')
f.write('kkkktest')
# r=open('/Users/mac/Desktop/test.rtf')
# print r.read() #查看文件没有写入
f.close() #调用close或flush才会把缓存写入到磁盘
r=open('/Users/mac/Desktop/test.rtf')
print r.read() #查看文件已经写入
# 写缓存,当写入数据>=缓存,则会把缓存中的数据同时同步到磁盘上,后面多出的缓存再次将剩下的数据写入到缓存时,才要调用close和flush
f=open('/Users/mac/Desktop/test.rtf','w')
for i in range(100000):
    f.write('test write'+str(i)+'\n')
#在后台用ls -l test.rtf 文件的大小:155648个字节
#在后台用vi test.rtf查看文件,只写到了test write 9796行,故此时磁盘已经满了,所以它先将满的缓冲区直接同步到磁盘,
#此时空出缓冲区存剩下的数据,故剩下的数据还没有让缓冲区满,故要调用close方法将剩下的写入到磁盘
f.close()
#在后台用ls -l test.rtf 文件的大小:15889个字节,比原来的大
#vi test.rtf,查看最后一行shift+G查看,全部已经写入到磁盘了

文件的关闭:
文件要关闭的三个原因:
1.将写缓存同步到磁盘
2.linux系统中每个进程打开文件的个数是有限的
3.如果打开文件数到了系统限制,在打开文件后会失败
打开文件超过限制的实例:
"""
1.打开文件,查看系统最大的文件打开值,在命令行中,ps,查看python的进程号PID,查看该进程的cat /proc/20384/ 下面的相关属性
  查看limit属性:cat /proc/20384/limits 查看max open files 对应的值soft Limit是1024,故只能打开1024个文件
2.打开一个文件,查看是否到1024个的时候就无法再打开了
"""

#2.打开一个文件,查看是否到1024个的时候就无法再打开了
list_f=[]
for i in range(1025):
    list_f.append(open(("/Users/mac/Desktop/test.rtf"),'w'))
    print "%d:%d" %(i,list_f[i].fileno()) #结果是:1017:1023 后就报Too mangy open files:错误

文件指针:

#文件指针的操作:
  seek(offset,whence):移动文件指针
        offset:偏移量,可以是负数
        whence:偏移相对位置
文件指针定位方式有三种:
    os.SEEK_SET:相对文件起始位置;
    os.SEEK_CUR:相对文件当前位置;
    os.SEEK_END:相对文件结尾位置
#tell()函数是查看文件指针当前指向的位置
import os
f=open('/Users/mac/Desktop/test.rtf','r+')
print f.tell()
print f.read(3)
f.seek(0,os.SEEK_SET) #从文件起始位置
print f.tell()
print f.read(3)
f.seek(0,os.SEEK_END) #从文件末尾开始读取第0个
f.tell() #此时返回的当前位置应该是末尾,即文件的长度
#ls -l test.rtf查看文件的长度是否和上面的f.tell()一样
f.read()
f.seek(-5,os.SEEK_END) #从末尾往前读5位开始读取
f.tell()
print f.read()
f.tell() #到文件的最后一位
f.seek(-19,os.SEEK_END) #若文件里总共就18个字符,要往前读19位,肯定会报错

python文件属性及OS模块使用
os模块用于提供跨操作系统的、可以移植的操作,若想你的代码可以用于所有操作系统,可以用OS模块
     
     
file.fileno():文件描述符 file.mode: 文件打开权限,只读只写 file.encoding:文件编码格式 file.closed:文件是否关闭
eg:	
f=open('/Users/mac/Desktop/test.rtf')
print f.fileno()
print f.mode
print f.closed
f.close()
(1)python 标准文件有以下三类:
文件标准输入:sys.stdin
文件标准输出:sys.stdout
文件标准错误:sys.stderr

import sys
type(sys.stdin)
print sys.stdin.mode  #它是只读的
sys.stdin.read()  #它是空值
sys.stdin.fileno()  #返回值为0
a=raw_input("a:")  #它实际上是调用了stdin输入,输入到控制台
#输入00000,此时在终端控制台打印出来a是0000
sys.stdout.mode #它是只写的,'w'
sys.stout.write('1000') #打印会输出到控制台,它其它是和print一样
print '1111' #它会调用stout
sys.stdout.fileno() #返回1
sys.stderr.mode #它是只写,'w'
sys.stderr.write('1000')  #控制台会返回1000,
sys.stderr.fileno()   #返回值2

(2)python 文件命令行参数:
sys模块提供sys.argv属性,通过该属性可以得到命令行参数
sys.argv:字符串组成的列表
import sys
if __name__=='__main__':
    print len(sys.argv)
    for arg in sys.argv:
        print arg
#运行python arg.py 0,1,2,3 输入参数
import codecs
f=open('/Users/mac/Desktop/test.rtf','r+')
f.read()
f.write('1,2,3')
# f.write(u'生活') #报'ascii' codec can't encode
#方法一,将Ascii码转换成utf-8
a=unicode.encode(u'生活','utf-8') #将unicode转换成utf-8后再写入
print a
f.write(a)
f.read()
f.close()
# 方法二:使用codecs模块提供的方法创建指定编码格式的文件
# open(fname,mode,encoding)
f=codecs.open('/Users/mac/Desktop/test.rtf','w','utf-8')
print f.encoding  #返回utf-8
f.write(u'学习')  #不会像上面一样报错,且写入成功
import os
f.seek(0,os.SEEK_SET) #文件指针移到最开始位置
# print f.read() #用read方法会报File not open
#可用command端cat test.rtf文件查看是否正确写入
f.close()
(3)os模块方法和os path方法介绍
import os
#用os文件系统创建文件并以读写方式打开,和read,write,seek基本一样,只是偏向更底层
#linux中把所有外围设备都包装成一个统一的接口,当我们调用open时会调用此接口
fd=os.open('imoc.txt',os.O_CREAT | os.O_RDWR)
# os.write(fd,'immooc')
l=os.lseek(fd,0,os.SEEK_SET)
print(l)
str1=os.read(fd,5)
os.close(fd)
#os模块方法介绍
"""
os.listdir(os.getcwd()):获得当前目录再获得当前目录下的所有文件
access(path,mode):判断文件权限,F_OK存在,权限:R_OK,W_OK,X_OK
listdir(path):返回当前目录下所有文件组成的列表
remove(path):删除文件
rename(old,new):修改文件或者目录名
mkdir(path,mode):创建目录
makedirs(path,mode):创建多级目录
removedirs(path):删除多级目录
rmdir(path):删除目录(目录必须空目录)
"""
print(os.access('imoc.txt',os.R_OK))
print(os.listdir('./'))
print(os.rename('imoc.txt','imoc1.txt'))
print(os.remove('imoc.rtf'))

os.mkdir('test')
os.makedirs('test/test1/test2')
os.removedirs('test')  #会报Directory not empty: 'test'错误
os.removedirs('test/test1/test2')  #整个路径写全了才可以删除成功

#os.path模块方法介绍
"""
split():用来返回路径目录名和文件名
exists(path):当前路径是否存在
isdir(s):是否是一个目录
isfile(path):是否是一个文件
getsize(filename):返回文件大小
dirname(p):返回路径的目录
basename(p):返回路径的文件名
join(path,name):将目录与文件名或者目录等连接起来
#路径拆分为两部分,后一部分总是最后级别的目录和文件名
os.path.split("/User/mic/dir/test.txt")
#拆分返回的是扩展名
os.path.splitext("/User/mic/dir/test.txt")
"""print(os.path.exists('./imoc.txt'))print(os.path.isdir('imoc.txt'))print(os.path.isdir('./'))print(os.path.isfile('imoc.txt'))print(os.path.getsize('imoc.txt'))print(os.path.basename('./imoc.txt'))print(os.path.dirname('./imoc.txt'))
#列出所有.py的文件
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值