文件操作方法

1 读
with open(r'文件路径', 'r(只读模式)', encoding='utf8(万国表)') as f(参数):
print(f.read()) #一次性读取文件所有的内容
print(f.readline()) #m每次只读取文件一行内容
print(f.readlines()) #读取文件所有的内容 组织成列表,每个元素是文件的每行内容
print(f.readable())   #判断当前文件是否具备读的能力
2写
with open(r'文件路径', 'w(只写模式)', encoding='utf8(万国表)') as f(参数):
f.write('需要往文件内容写入文本的内容')
f.write('123') #写入的内容必须是字符串类型
f.writelines(['jason(参数)', 'kevin(参数)','tony(参数)']) #可以将列表中多个字符串元素全部写入
print(f.writable())  #Ture	#判断当前文件是否具备写的能力
print(f.readable())  #False  #判断当前文件是否具备读的能力
f.flush #直接将内存内的文件数据刷到硬盘  相当于ctrl+s

文件优化操作

with open(r'文件路径', 'r(只读模式)', encoding='utf8(万国表)') as f(参数):
print(f.raed())  #一次性获取读取文件所有的内容
print(f.raed())  #一次性获取读取文件所有的内容
print(f.raed())  #一次性获取读取文件所有的内容
"""
1.一次性读完之后,光标停留在了文件末尾,无法再次读取内容
2.该方法在读取大文件的时候,可能会造成内存溢出的情况

解决上述策略就是逐行读取文件内容
"""
for line in f: #文件变量名 f 支持 for 循环,相当于一行行读取文件内容
    print(line)
"""
以后涉及到多行文件内容的情况一般都是采用for循环读取
"""

文件操作模式

t	文本模式
	1.默认的模式
    	r w a  >>> rt wt at
    2.该模式所有操作都是以字符串基本单位(文本)
    3.该模式必须要指定encoding参数
    4.该模式只能操作文本文件
    
b   二进制模式
	1.该模式可以操作任意类型的文件
    2.该模式所有操作都是以bytes类型(二进制)基本单位
    3.该模式不需要指定encoding参数
    	rb wb ab

练习题

单人注册功能

# 1先获取用户的用户名和密码
username = input('username>>>: ').strip()
password = input('password>>>: ').strip()
# 2.将用户名和密码组成一个字符串,为什么要转成字符串,那是因为用文件操作必须用字符串候装二进制,其他都不行
data = '%s|%s' % (username, password)
# 3.文件操作 写入数据
with open(r'userinfo.txt', 'w', encoding='utf8') as f:
#     3.1读取文件的所有内容
    f.write(data)
# 用户用格式化打印
print('用户:%s 注册成功' % username)

多人注册功能

# 多人注册要用while循环 我们用while循环一下
while True:
    # 1先获取用户的用户名和密码
    username = input('username>>>: ').strip()
    password = input('password>>>: ').strip()
    # 2.将用户名和密码组成一个字符串,为什么要转成字符串,那是因为用文件操作必须用字符串候装二进制,其他都不行
    data = '%s|%s\n' % (username, password)
    # 2.1判断用户名是否存在
    with open(r'userinfo.txt', 'r', encoding='utf8') as f1:
        # 2.2循环要读取每一行的用户数据
        for line in f1:
            # 2.3用解压的方式进行解压获取每一行数据中的用户名
            real_name, real_word = line.split('|')
            # 2.4用循环判断是否一致
            if username == real_name:
                print('用户名已经存在')
                break
        else:
            # 3.文件操作 写入数据
            with open(r'userinfo.txt', 'a', encoding='utf8') as f:
            #     3.1读取文件的所有内容
                f.write(data)
            # 用户用格式化打印
            print('用户:%s 注册成功' % username)

单人登录功能

 1.获取用户名和密码
username = input('username>>>: ').strip()
password = input('password>>>: ').strip()
# 2.获取文件内真实的用户数据
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
    # 用read()可以获取全部的内容,所以我们可以直接取完
    data = f.read() #data是右边获取内容定义的量名
    """with子代码执行完之后的结果是可以在外面使用的"""
# 3.用切割字符串的方式获取真实的用户名和密码
res = data.strip('|') #
'''这里也可以直接使用解压赋值的操作  real_name,real_pwd = data.split('|')'''
# 4.获取到了真实的账号和密码我们就可以进行比对数据
if username == res[0] and password == res[1]:#我们可以使用判断的方式来进行判断数据是否相等
    print('登录成功') #如果一致 就获取成功
else:
    print('用户名或密码错误') #如果不一致 获取失败

多人登录功能

# 如果需要多用户登录,那得需要循环
while True:
    # 1.获取用户名和密码
    username = input('username>>>: ').strip()
    password = input('password>>>: ').strip()
    # 2.获取文件内真实的用户数据
    with open(r'userinfo.txt', 'r', encoding='utf8') as f:
        for lien in f:
            # 3.用解压赋值的方式获取用户名和密码
            real_name, real_world = lien.split('|') #
    # 4.获取到了真实的账号和密码我们就可以进行比对数据
            if username == real_name and password == real_world.strip():    #我们可以使用判断的方式来进行判断数据是否相等
                print('登录成功') #如果一致 就获取成功
                break #获取成功直接结束
        else:
            print('用户名或密码错误') #如果不一致 获取失败

代码整合

while True:
    print("""
    &&&&1.注册功能&&&&
    &&&&2.登录功能&&&&
    """)
    choice = input('请输入您想要的功能编号>>>: ').strip()
    if choice == '1':
        # 1先获取用户的用户名和密码
        username = input('username>>>: ').strip()
        password = input('password>>>: ').strip()
        # 2.将用户名和密码组成一个字符串,为什么要转成字符串,那是因为用文件操作必须用字符串候装二进制,其他都不行
        data = '%s|%s\n' % (username, password)
        # 2.1判断用户名是否存在
        with open(r'userinfo.txt', 'r', encoding='utf8') as f1:
            # 2.2循环要读取每一行的用户数据
            for line in f1:
                # 2.3用解压的方式进行解压获取每一行数据中的用户名
                real_name, real_word = line.split('|')
                # 2.4用循环判断是否一致
                if username == real_name:
                    print('用户名已经存在')
                    break
            else:
                # 3.文件操作 写入数据
                with open(r'userinfo.txt', 'a', encoding='utf8') as f:
                #     3.1读取文件的所有内容
                    f.write(data)
                # 用户用格式化打印
                print('用户:%s 注册成功' % username)

    if choice == '2':
        # 1.获取用户名和密码
        username = input('username>>>: ').strip()
        password = input('password>>>: ').strip()
        # 2.获取文件内真实的用户数据
        with open(r'userinfo.txt', 'r', encoding='utf8') as f:
            for lien in f:
                # 3.用解压赋值的方式获取用户名和密码
                real_name, real_world = lien.split('|') #
        # 4.获取到了真实的账号和密码我们就可以进行比对数据
                if username == real_name and password == real_world.strip():    #我们可以使用判断的方式来进行判断数据是否相等
                    print('登录成功') #如果一致 就获取成功
                    break #获取成功直接结束
            else:
                print('用户名或密码错误') #如果不一致 获取失败



二进制模式读写操作

 with open(r'a.txt', 'rb') as f:
       #直接用 'b'的模式打印出来的是二级制
      print(f.read())  #b'\xe6\x88\x91\xe5\x91\xbd\xe7\x94\xb1\xe6\x88\x91\xe4\xb8\x8d\xe7\x94\xb1\xe5\xa4\xa9' 
      #读取模式用 b 模式取出来的模式是二级制  而二级制是很难辨认 我们可以在打印的时候使用万国码 把它转换出来 这样容易我们辨认
      print(f.read(6).decode('utf8')) #我命 
 """
  在b模式下表示字节个数
        英文字符统一使用一个bytes来表示
        中文字符统一使用三个bytes来表示
 """  
        
with open(r'a.txt', 'r', encoding='utf8') as f:
    #f是变量命 可以改 用read 是一次性把文件内容取完
    # print(f.read())  #我命由我不由天
    # f是变量命 可以改 用read 是一次性把文件内容取完 4是要取文件内容的字符个数 在t模式下表示字符个数 括号里几就表示要取几个字符
    print(f.read(4)) #我命由我
"""
read()  括号内可以放数字
    在t模式下表示字符个数
   
"""

文件内光标的移动

with open(r'b.txt', 'rb') as f:
    #read一次性取所有的值()括号里值是想取的值
    print(f.read(3).decode('utf8'))
    # 查看光标移动多少字节
    print(f.tell())
    f.seek(3,1)   #命由我不由天
    print(f.read().decode('utf8'))

"""
控制文件内光标的移动  f.seek()
f.seek(offset,whence)
    offset表示位移量
        始终是以字节为最小单位
            正数从左往右移动
            负数从右往左移动
    whence表示模式
        0:以文件开头为参考系(支持tb两种模式)
        1:只支持b模式 以当前位置为参考系
        2:只支持b模式 以文件末尾为参考系
"""


文件的内容修改

# 方式1 覆盖
# with open(r'c.txt','r',encoding='utf8') as f:
#     data = f.read()
#     # print(type(data))
# with open(r'c.txt','w',encoding='utf8') as f1:
#     new_data = data.replace('tony','jason')
#     f1.write(new_data)

# 方式2 新建
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
        open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt')  # 删除原文件
os.rename('c.txt.swap', 'c.txt')  # 重命名文件

posted on 2021-11-11 16:19  狼行千里吃肉  阅读(134)  评论(0)    收藏  举报

import time with open('a.txt', 'rb') as f: f.seek(0, 2) while True: line = f.readline() if len(line) == 0: # 没有内容 time.sleep(0.5) else: print(line.decode('utf-8'), end='')