python对文件的操作(十五)
我们对文件的操作,一般情况下,分为三种情况,分别是:打开文件,操作文件(读写等),关闭文件。在
Python的语言了,提供了对文件的操作方法,默认open()是打开文件并且是只读模式,事实上打开和关闭文件
比较很好的理解,操作文件,那么操作文件的前提是打开文件,打开文件就涉及到以什么样的模式来打开文件,
比如读,写,只读,只写,二进制等等模式,具体总结的见如下:
r:只读模式
w:只写模式【不可读,不存在就创建,存在就清空内容】
x:只写模式【不可读,不存在就创建,存在就报错】
a:增加模式【可读,不存在就创建,存在只增加内容】
"+"表示可以同时读写某个文件,具体为:
r+:读写
w+:写读
x+:写读
a+:写读
下面以实际的代码来说明各种模式的应用,实现的代码为:
#!/usr/bin/env python #-*- coding:utf-8 -*- def onlyWrite(): '''只写的模式操作文件''' f=open('log.txt','w') f.write('Hello Python') f.close() def onlyRead(): '''只读模式来操作文件''' f=open('log.txt','r') print u'文件内容为:',f.read() f.close() def addFile(): '''增加对文件的内容''' f=open('log.txt','a') f.write('\nAdd File Content') f.close() def byteRead(): '''以字节的模式读取文件''' f=open('log.txt','rb') data=f.read() f.close() print u'读取到的文件内容为:',data,u'类型为:',type(data) def typeWrite(): '''以二进制的模式写文件''' f=open('log.txt','wb') f.write(bytes('Hello Django!')) f.close()
在读取文件的时候,目前是直接读取所有的文件,事实上,比如一个文件里面内容是:“Hello Django!”,我直接想从Django开始读取,
并不想从Hello读取,那么就涉及到文件指针,比如见如下的代码,可以获取到文件的指针位置这些,具体见代码:
#!/usr/bin/env python #-*- coding:utf-8 -*- def pointer(): '''文件指针的应用''' f=open('log.txt','r+') print u'当前文件的指针位置为:',f.tell() print f.read() f.seek(0,2) f.write('asdfg') f.seek(0) print f.read() print u'写入文件之后的指针位置:',f.tell() f.close()
w+的模式是先清空文件里面的内容,再写之后就可以读取文件的内容了,见实现的代码:
#!/usr/bin/env python #-*- coding:utf-8 -*- def writeGage(): f=open('log.txt','w+') f.seek(0,2) f.write('wuya') f.seek(0) data=f.read() f.close() print u'最新的文件内容是:',data
a+是在原有文件的基础上增加新写的文件内容,具体见实现的代码(log.txt文件内容是wuya):
#!/usr/bin/env python #-*- coding:utf-8 -*- def file1(): f=open('log.txt','a+') f.seek(0,2) f.write('\nHello Django!') f.seek(0) data=f.read() f.close() print data
对文件的基本操作,一般使用到的方法为具体为:
close()关闭文件
fileno()文件描述符
flush()刷新文件内部缓存区
isstty()判断文件是否同意tty设置
read()读取指定文件字节数据
readable()是否可读
readline()仅读取一行数据
seek()指定文件中指针位置
tell()获取指针位置
writeable()是否可写
truncate()截取数据,仅保留指定之前数据
循环读取文件的内容,比如文件里面存在的内容为:
name:wuya age:20 address:xian
循环读取文件的代码为:
#!/usr/bin/env python #-*- coding:utf-8 -*- f=open('log.txt','r') for line in f: print line f.close()
见执行该代码后,输出的内容为:
C:\Python27\python.exe D:/git/Python/FullStack/share/fileTest2.py name:wuya age:20 address:xian Process finished with exit code 0
在如上的操作文件中,对文件的基本操作,第一个步骤是open()打开,下来是对文件的基本操作,最后一个步骤是close()文件,
有没一种方式是直接打开文件,下来是对文件的基本操作,而没有关闭文件这个环节了?当然,只有有需求,是可以实现的,使用
关键字with,使用该关键字就不需要关闭文件,with另外一个强大的地方是同时支持打开二个文件,是在2.7.X版本之后才有的该功
能,如下实现打开二个文件,并且读取二个文件的内容,见实现的代码:
#!/usr/bin/env python #-*- coding:utf-8 -*- with open('log1.txt','r') as f1,open('log2.txt','r') as f2: print u'第一个文件的内容为:',f1.read() print u'第二个文件的内容为:',f2.read()
见执行如上的代码后输出的内容:
C:\Python27\python.exe D:/git/Python/FullStack/share/fileTest2.py 第一个文件的内容为: this is a first file 第二个文件的内容为: this is a second file Process finished with exit code 0
下面实现读取文件的同时进行写文件,log1.txt文件内容为:
name:wuya age:20 address:xian
log2.txt文件内容为空。
下面使用with关键字来实现读取文件log1.txt的内容同时写入到log2.txt文件中,见实现的代码:
#!/usr/bin/env python #-*- coding:utf-8 -*- with open('log1.txt','r') as f1,open('log2.txt','w') as f2: for line in f1: f2.write(line) print u'log2.txt文件写数据之后文件内容为:' with open('log2.txt', 'r') as f: for line in f: print line
执行如上的代码后,输出的内容为:
C:\Python27\python.exe D:/git/Python/FullStack/share/fileTest2.py log2.txt文件写数据之后文件内容为: name:wuya age:20 address:xian
如下通过一个登录的案例,来说明文件的基本使用和操作,存储用户名和密码的文件内容为:username&password,
见实现的代码:
#!/usr/bin/env python #-*- coding:utf-8 -*- import sys def login(): username=raw_input(u'请输入用户名:\n') password=raw_input(u'请输入密码:\n') with open('userinfo.md','r') as f: for userInfo in f: #去掉文件的换行 userInfo=userInfo.strip() info=userInfo.split('&') if username==info[0] and password==info[1]: print u'恭喜您,登录成功!' sys.exit(1) else: print u'Sorry,用户名或者密码错误' if __name__=='__main__': login()
在函数的学习中,我们知道,函数有是形式函数的,那么我们修改下如上的代码,让函数有二个参数,这样可以不需要
直接输入就可以了,见实现的代码:
#!/usr/bin/env python #-*- coding:utf-8 -*- import sys def login(username,password): # username=raw_input(u'请输入用户名:\n') # password=raw_input(u'请输入密码:\n') with open('userinfo.md','r') as f: for userInfo in f: #去掉文件的换行 userInfo=userInfo.strip() info=userInfo.split('&') if username==info[0] and password==info[1]: print u'恭喜您,登录成功!' sys.exit(1) else: print u'Sorry,用户名或者密码错误' if __name__=='__main__': login('username','password')
默认函数的一种写法,见实现的代码:
#!/usr/bin/env python #-*- coding:utf-8 -*- import sys def login(username='username',password='password'): # username=raw_input(u'请输入用户名:\n') # password=raw_input(u'请输入密码:\n') with open('userinfo.md','r') as f: for userInfo in f: #去掉文件的换行 userInfo=userInfo.strip() info=userInfo.split('&') if username==info[0] and password==info[1]: print u'恭喜您,登录成功!' sys.exit(1) else: print u'Sorry,用户名或者密码错误' if __name__=='__main__': login()
如上的代码,还是不够完善,应该增加注释信息,毕竟写代码不是给自己写的,是给别人看的,见添加注释后的代码:
#!/usr/bin/env python #-*- coding:utf-8 -*- import sys def login(username='username',password='aaa'): ''' :param username: 用户名 :param password: 密码 :return:成功返回True,失败返回False ''' # username=raw_input(u'请输入用户名:\n') # password=raw_input(u'请输入密码:\n') with open('userinfo.md','r') as f: for userInfo in f: #去掉文件的换行 userInfo=userInfo.strip() info=userInfo.split('&') if username==info[0] and password==info[1]: print u'恭喜您,登录成功!' return True return False # else: # print u'Sorry,用户名或者密码错误' if __name__=='__main__': login()
下面对登录部分更加的完善下,增加用户的注册,也就是用户的读写,用户是否存在的检查,见实现的代码:
#!/usr/bin/env python #-*- coding:utf-8 -*- import sys def register(username,password): '''注册用户''' with open('userinfo.md','w') as f: userinfo=username+"&"+password f.write(userinfo) def user_exist(username): ''' 检查用户名是否存在 :param username:要检测的用户名 :return:返回为True表示用户名存在,返回为False表示用户名不存在 ''' with open('userinfo.md','r') as f: userinfo=f.read() userinfo=userinfo.strip() for info in userinfo: info=userinfo.split('&') if username==info[0]: return True return False def login(username='username',password='aaa'): ''' :param username: 用户名 :param password: 密码 :return:成功返回True,失败返回False ''' with open('userinfo.md','r') as f: for userInfo in f: #去掉文件的换行 userInfo=userInfo.strip() info=userInfo.split('&') if username==info[0] and password==info[1]: print u'恭喜您,登录成功!' return True return False def is_login_check(): """ 用于用户的二次检查和验证 :return: """ username=raw_input(u'请输入您的账号:\n') is_user_exists=user_exist(username) if is_user_exists: password=raw_input(u'请输入账号的密码:\n') is_login=login(username,password) if is_login: return u'登录成功!' else: print u'用户名或者密码错误!' else: print u'Sorry,您输入的账号不存在' inp=raw_input(u'是否注册Y/N:\n') if inp==Y: register() else: sys.exit(1) if __name__=='__main__': while True: print u'=======欢迎登录无涯博客系统=======' inp = int(raw_input('1、登录 2、注册 3、退出 \n')) if inp == 1: is_login_check() elif inp == 2: register('username','password') elif inp == 3: sys.exit(1) else: break