Python Note -- Day 9. 文件操作

15 文件操作

针对磁盘中文件的读写,文件I/O

  • 文件操作步骤:
    1.打开文件 2.读写文件 3.关闭文件
  • 写入文件的操作:(把大象装进冰箱)
    1.打开文件 open()
    2.写入内容 write()
    3.关闭文件 close()
  • 读取文件的操作:(把大象从冰箱取出)
    1.打开文件 open()
    2.读取内容 read()
    3.关闭文件 close()

15.1 文件的基础操作

1.open()
格式:open(文件的路径,打开方式,[字符集])

  • 路径 url 统一资源定位符
    • 相对路径: 针对文件的表示:
      1.txt ==> 具体文件前没有任何表示时,默认为当前目录中的1.txt
      ./1.txt ==> 代表当前目录中的1.txt
      ../1.txt ==> 代表当前目录中的上一级目录中的1.txt
      ../a/b/1.txt ==> 代表当前目录中的a目录中的b目录中的1.txt
    • 绝对路径:
      windows: c:/users/appdata/1.txt
      linux: /user/home/yc/1.txt
  • 打开方式:
    基础模式: w r x a
    • w 模式:write 写入
      1.文件如果不存在,则创建文件
      2.文件如果存在,则打开文件,并且清空文件内容
      3.文件打开后,文件指针在文件最前面
    • r 模式:read
      1.若文件不存在,报错
      2.文件存在,则打开文件
      3.文件指针在文件最前面
    • x 模式:xor 异或
      1.文件不存在,则创建
      2.文件存在,报错(防止覆盖)
      3.文件指针在文件最前面
    • a 模式: append() 追加
      1.文件不存在,则创建
      2.文件存在,则打开 (和w模式区别,文件打开后不会清空)
      3.文件指针在文件最后
    • 扩展模式:
      1.b模式 bytes 二进制
      2.+模式 plus 增强模式(可读可写)
  • encoding 可选参数,设置文件的字符集
    如果是一个二进制文件,则不需要设置字符集
    encoding='utf-8'
# 1.打开文件,创建了一个文件对象
fp = open('./1.txt','w',encoding='utf-8')
print(fp,type(fp))

# 2.写入内容
# 使用文件对象,调用write(),写入
fp.write('hello world')

# 3.关闭
fp.close()

# 2.读取内容
# 使用文件对象,调用read()
res = fp.read()
print(res)

文件操作模式的组合:
w,r,a,x
wb,rb,ab,xb
w+,r+,a+,x+
wb+,rb+,ab+,xb+

15.2 打开模式的演示操作

文件操作的高级写法

'''
with open(文件路径,打开模式) as 变量:
    变量.操作()
'''
with open('./1.txt','r+',encoding='utf-8') as fp:
    rs = fp.read()
    print(rs)
    fp.write(rs)
  • r+ 模式是可读可写
  • w+ 模式也是可读可写,但是w模式的特点是打开之后直接清空文件
  • a+ 模式 追加写,但光标在最后读不到内容
  • x+ 异或
with open('./2.txt','x+',encoding='utf-8') as fp:
    rs = fp.write('my headache')
    re = fp.read()    # 读不到,写入后,光标在最后
    print(re)

15.3 文件操作相关函数

  • 2.write(字符串)
    • writelines(容器类型)
      注意:容器类型必须是可写入的字符串
aa='exaggerate'
aa = ['one','two']
aa = {'name':'ll','age':'20'}   # 只能写入key
with open('./1.txt','w',encoding='utf-8') as fp:
    fp.writelines(aa)
  • 3.read()
    格式:文件对象.read() 从当前指针读到最后
    格式:文件对象.read(读取的字节数) 可以读取指定长度的字符
    • readline() 一次只能读取一行,光标移动
    • readline(int) 可以读取当前行指定的字节数,超过则读取整行
    • readlines() 一次读取多行,每行作为一个元素,返回一个列表
    • readlines(hint) 按照行进行读取hint字节数,多进少补,不够一行按一行算
with open('./1.txt','r',encoding='utf-8') as fp:
    res = fp.readline()
    print(res)
    res = fp.readline()
    print(res)
                        '''
                        once upon a time
                        
                        there is a lovely '''
with open('./1.txt','r',encoding='utf-8') as fp:
    # res = fp.readlines()  # ['once upon a time\n', 'there is a lovely \n', 'rabbit\n', 'living\n', 'in the forest']

    # res = fp.readlines(16)   # ['once upon a time\n']
    res = fp.readlines(17)     # ['once upon a time\n', 'there is a lovely \n']
    print(res)
  • 4.seek()
    seek(self,offset,whence = 0) 设置指针的位置,字节
    offset : 指针偏移量
    whence : 指针所在位置,0:指针在文首;1:指针当前位置;2:文末
with open('./1.txt','a+',encoding='utf-8') as fp:
    # a+ 模式 指针默认在文件最后,直接读取是读不到内容的
    fp.seek(0)  # 指针设置在文件开头
    fp.seek(4)
    res = fp.read()
    print(res)

with open('./1.txt','r+',encoding='utf-8') as fp:
    # r+ 模式 指针在开头
    fp.seek(0,2)  # 指针设置在文件末尾
  • 5.truncate(size) 截断文件内容并更新文件
    默认从文件首行的首个字符开始,截断长度为size个字节数
    size为0,则直接从当前位置截断到最后
with open('./1.txt','r+',encoding='utf-8') as fp:
    fp.truncate(56)

 文件写入可以进行网站爬虫

from urllib import request

response = request.urlopen("http://www.baidu.com/")  # 打开网站
fi = open("project.txt", 'w')                        # open一个txt文件
page = fi.write(str(response.read()))                # 网站代码写入
fi.close()                                           # 关闭txt文件

15.3 文件操作 练习题

1.使用数据写入文件的方式,完成一个注册和登录
实现功能:
用户输入用户名和密码以及确认密码
用户名不能重复,密码长度大于3
两次密码要一致
可以用已经注册的账户登录
密码如果错误3次,则锁定,不能登录

提示:
strip() !!!
split() !!!
封装函数
在1.txt没创建时 r 模式会报错,采用 a+模式,同时设置指针在文首
登录时检测用户名是否存在
获取用户名在用户列表的索引位置
inx = userlist.index(name)
if pwd == pwdlist[inx]
检测用户是否属于锁定状态,判断用户是否在黑名单中
判断当前脚本是否作为一个主进程脚本在执行:

if __name__=='__main__':  
  这里的代码,只有在使用python解释器直接运行时才执行  
  如果当前的脚本,作为一个模块被其他文件都如后使用,那么这个地方的代码不会执行
  因此这个地方的代码,适合写当前脚本中的一些测试,这样不会影响其他脚本
  pass
def register():
    while True:
        name = input('please set username : ')
        userlist = []
        with open('./1.txt','r',encoding='utf-8') as fp:
            res = fp.readlines()
        for i in res:
            re = i.strip('\n')
            rr = list(re.split(':'))
            userlist.append(rr[0])
        if name not in userlist:
            break
        else:
            print('username already exists ! ')
    while True:
        pwd = input ('please set password : ')
        if len(pwd) > 3:
            break
        else:
            print('please set number more than 3 digits !')
    while True:
        pwd1 = input('please repeat password : ')
        if pwd == pwd1:
            info = f'{name}:{pwd}\n'
            with open('./1.txt','a',encoding='utf-8') as fp:
                fp.write(info)
            print('register success !')
            break
        else:
            print('second time is different !')
def login():
    name = input('please enter username : ')
    count = 1
    with open('./1.txt', 'r', encoding='utf-8') as fp:
        res = fp.readlines()
    test = f'{name} is lock\n'
    if test in res:
        print('ur account is locked ! please contact manager !')
    else:
        while count < 4:
            pwd = input('please enter ur password : ')
            use = f'{name}:{pwd}\n'
            if use in res:
                print('login success !')
                break
            else:
                print(f'wrong code ! {3-count} times left !')
                count += 1
                lock = f'{name} is lock\n'
                with open('./1.txt', 'a', encoding='utf-8') as fp:
                    fp.write(lock)
    if count == 4 :
        print('ur account is locked ! please contact manager !')
while True:
    n = input('please enter 1 to login or enter 2 to register : ')
    if n == '1':
        login()
        break
    elif n =='2':
        register()
        break
    else:
        print('wrong !')

老师版

userlist = []
pwdlist = []

def readuserlist():
    # 在1.txt没创建时 r 模式会报错,采用 a+模式,同时设置指针在文首
    with open('./1.txt','a+',encoding='utf-8') as fp:
        fp.seek(0)
        res = fp.readlines()
        for i in res:
            re = i.strip('\n')
            rr = list(re.split(':'))
            userlist.append(rr[0])
            pwdlist.append(rr[1])
    with open('./blacklist.txt','a+',encoding='utf-8') as fp:
        fp.seek(0)
        blacklist = fp.readlines()

def register():
    while True:
        name = input('please set username : ')
        if name not in userlist:
            while True:
                pwd = input('please set password : ')
                if len(pwd) > 3:
                    while True:
                        pwd1 = input('please repeat password : ')
                        if pwd == pwd1:
                            info = f'{name}:{pwd}\n'
                            with open('./1.txt', 'a', encoding='utf-8') as fp:
                                fp.write(info)
                            print('register success !')
                            break
                        else:
                            print('second time is different !')
                    break
                else:
                    print('please set number more than 3 digits !')
            break
        else:
            print('username already exists ! ')

def login():
    while True:
        name = input('please enter username : ')
        errnum = 3
        if name in userlist:
            test = f'{name}\n'
            if test in blacklist:
                print('ur account is locked ! please contact manager !')
            else:
                while errnum >0:
                    pwd = input('please enter ur password : ')
                    use = f'{name}:{pwd}\n'
                    if use in res:
                        print('login success !')
                        break
                    else:
                        errnum -= 1   # 注意注意!!
                        if errnum == 0:
                            print('ur account is locked ! please contact manager !')
                            with open('./blacklist.txt', 'a', encoding='utf-8') as fp:
                                fp.write(name+'\n')
                        else:
                            print(f'wrong code ! {errnum} times left !')
            break
        else:
            print('wrong user !')

if __name__=='__main__':
    while True:
        n = input('please enter 1 to login or enter 2 to register : ')
        if n == '1':
            login()
            break
        elif n =='2':
            register()
            break
        else:
            print('wrong !')

-----------------------------------
另:还未测试
def checkfile():
    with open('D:/files/userinfos.txt','r+',encoding='utf-8') as f1:
        f1.seek(0)
        res=f1.read()
        return res

def writefile(writecontent):
    with open('D:/files/userinfos.txt','a+',encoding='utf-8') as f1:
        f1.write(writecontent)

def register():
    while 1:
        name=input('please set ur account : ')
        checkfile()
        if res.index[name]==None:
            while 1:
                pwd=input('please set ur password')
                if len(pwd)>3:
                    while 1:
                        pwd1=input('please repeat ur password')
                        if pwd==pwd1:
                            print('set success!\nnow u can login')
                            writefile(f'{name}:{pwd}\n')
                        else:
                            break
                else:
                    print('please set more than 3 digits password')
        else:
            print('name already exits')


def login():
    pwd1=input('please enter ur password: ')
    count=0
    if pwd1==pwd:
        print('login success !')
    else:
    while 1:
        pwd1=input('wrong, please reput correct password ')
        if pwd1 ==pwd:
            print('login success !')
            break
        else:
            count += 1
            if count >=3:
                print('wrong 3 times, ur account is locked!')
                break
            else:
                continue



a=input('please enter ur account: ')
a=a.strip(' ')
res=checkfile()
res=res.split('\n')
l=len(res)
res=[i.split(':') for i in res]
name=[x for x in [res[i][0] for i in range(l)]]
pwd=[x for x in [res[i][1] for i in range(l)]]
res=lambda x:True if a==name else False
if res==True:
    i=name.index(a)
    print(i)
    login()
else:
    register()

  • 扩展:可以实现购物,定义一些商品和价格,用户有100元,完成购物扣款
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值