我们对文件的操作,一般情况下,分为三种情况,分别是:打开文件,操作文件(读写等),关闭文件。在
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