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

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