【2022-06-29】Python文件处理(一)

Python文件处理

文件读写模式

补充知识:

1.with语法可以一次性打开多个文件

with open(r'123.txt', 'r', encoding='utf8') as f1, open(r'a.txt', 'r', encoding='utf8')as f2:
    print(f1.read())
    print(f2.read())
 
2.pass 是一个python补全语法,但是不执行任何操作,还有一种补全语法:...但是不推荐使用

3.在程序里边,读写是分离的,目的是为了防止文件过多,同时进行读写的话,容易造成文件数据的错乱


4.通常情况下,英语单词的末尾如果加上了able就表示具备了该单词描述的功能

readable   具备读取内容的功能  
writable   具备填写内容的功能
not readable  不具备读取内容的功能
not writable  不具备填写内容的功能



文件常用的三种读写模式: 

r  只读模式  使用该模式打开的文本文件只能进行读取操作,无法进行其他操作(比如写操作)  适用于读取数据的场景使用

# 当文件路径存在时:只读模式会打开文件,等待用户读取文件内容
with open(r'123.txt', 'r', encoding='utf8')as f:
    f.read()

# 当文件路径不存在时:只读模式r会直接报错

with open(r'666.txt', 'r', encoding='utf8')as f1:
    pass



w  只写模式  使用该模式打开的文本文件只能进行写操作,无法进行其他操作(比如读操作)    适用于产生数据的场景使用

# 当文件路径存在时:只写模式w在打开文件后,会清空文件的内容,之后等待用户填写新的内容
# with open(r'123.txt', 'w', encoding='utf8')as f:
#     pass

# 当文件路径不存在时:只写模式w会自动创建该文件

# with open(r'666.txt', 'w', encoding='utf8')as f1:
#     pass



a  追加模式  使用该模式打开的文本文件,默认在文件的末尾追加新的内容,无法进行其他的操作(比如读操作)

# 当文件路径存在时:追加模式a在打开文件后,不会清空文件的内容,只在文件的末尾等待用户填写新的内容
# with open(r'123.txt', 'a', encoding='utf8')as f:
#     f.write('好好学习,天天向上\n')

# 当文件路径不存在时:追加模式a会自动创建该文件

# with open(r'777.txt', 'a', encoding='utf8')as f1:
#     pass



默认情况下,用的都是只读模式r




文件操作模式

文件的操作模式有两种:

t   文本模式

    文件操作的默认模式
    
    r>>>>>>>>>>rt
    w>>>>>>>>>>wt
    a>>>>>>>>>>at
    
    特点:
    1.只能操作文本文件
    2.必须指定encoding参数
    3.读写数据默认都是以字符串为单位
    # with open(r'123.txt', 'r', encoding='utf8')as f:
    #     print(type(f.read()))                             # <class 'str'>


b   二进制模式

    rb wb ab  必须自己指定,不能省略
    
    特点:
    
    1.能够操作所有类型的文件
    2.不需要指定encoding参数
    3.读写都是以bytes为单位
    
    # with open(r'美女.png', 'rb')as f:
    #    print(f.read()          
      
    二进制模式下读写的数据都是二进制,可以打开任意数据类型的文件(图片、音频、视频等)
    
    二进制模式下可以实现拷贝功能
    
    with open(r'666.png', 'rb')as read_f, open(r'777.png', 'wb')as write_f:
    write_f.write(read_f.read())
    
   

文件操作方法

read()  一次性读取文件内容并且光标会停留在文件末尾 继续读则为空
	"""当文件数据较大的时候 不推荐一次性读取"""
	for line in f:
        print(line)  文件对象支持for循环一次只读一行
readline()  一次只读一行内容
readlines()  按照行的方式读取所有的内容并组织成列表返回
readable()  判断当前文件是否可读
writable()  判断当前文件是否可写
write()    填写文件内容
writelines() 支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值
flush()  将内存中的文件数据立刻刷到硬盘(主动按ctrl+s)


课题演练

# 1.编写简易版本的拷贝工具
# 自己输入想要拷贝的数据路径
# 自己输入拷贝到哪个地方的目标路径
# 任何类型数据皆可拷贝
# ps: 个别电脑C盘文件由于权限问题可能无法拷贝
# 换其他盘尝试即可

# 1.在本机电脑的D盘或其他盘符内创建文本文件
# 2.获取你想拷贝的文件所在路径
# 1.在本机电脑的D盘或其他盘符内创建文本文件
# 2.获取你想拷贝的文件所在路径
# file_start_path = input('请输入你想要拷贝的文件真实路径>>>:').strip()
# 3.获取要拷贝的目标路径
# file_end_path = input('请输入你想拷贝文件的目标路径>>>:').strip()
# 获取拷贝的文件,由于是任何数据类型,所以我们选择使用二进制模式b获取
# with open(r'D:\python\copy_exercise\666.jpg', 'rb') as f1, open(r'D:\python\copy_exercise\666_copy.jpg', 'wb') as f2:
#     for line in f1:          # 避免文件过大,所以采用for循环的方式读取数据
#         f2.write(line)



# 2.  利用文件充当数据库编写用户注册、登录功能
#     文件名称: userinfo.txt
#     基础要求:
#     用户注册功能 >>>: 文件内添加用户数据(用户名、密码等)
#     用户登录功能 >>>: 读取文件内用户数据做校验
#     ps: 上述功能只需要实现一次就算过关(单用户)
#     文件内始终就一个用户信息

# 单用户模式下先写注册功能

# username = input('请输入您的用户名>>>:').strip()
# password = input('请输入您的密码>>>:').strip()
# 2.创建用户数据的格式
# user_info = f'{username}|{password}'
# 3.把真实的用户写入userinfo.txt文件
# with open(r 'userinfo.txt', 'w', encoding='utf8') as f:
#     f.write(user_info)


# 注册功能写完了,开始写登录功能

# 1.获取用户的登录信息
# username = input('请输入您的用户名>>>:').strip()
# password = input('请输入您的密码>>>:').strip()
# 2.读取用户数据
# with open(r'userinfo.txt', 'r', encoding='utf8') as f:
#     info = f.read()
# 3.切割用户数据
# real_name, real_password = info.split('|')
# 4.比对用户名和密码是否正确
# if username == real_name:
#     if password == real_password:
#         print('登录成功')
#     else:
#         print('对不起,您输入的密码错误,请重新输入!!!')
# else:
#     print('对不起,您输入的用户名错误,请重新输入!!!')





#     拔高要求:
#     用户可以连续注册
#     用户可以多账号切换登录(多用户)
#     文件内有多个用户信息
#     ps: 思考多用户数据情况下如何组织文件内数据结构较为简单
#     提示: 本质其实就是昨天作业的第二道题
#     只不过数据库由数据类型变成文件

# 1.先写注册功能
# username = input('请输入你定义的真实用户名>>>:').strip()
# password = input('请输入你定义的真实密码>>>:').strip()
# # 2.判断要注册的用户是否已经存在
# with open(r'userinfo.txt', 'r', encoding='utf8') as f:
#     for i in f:
#         name = i.split('|')[0]  # 因为只判断用户名是否存在,所以在切割成列表后,利用索引取值,即取出用户名
#         if username == name:
#             print('此用户名已存在,请重新输入')
#             break  # 如果用户名没有被注册,等循环正常结束后,执行else下面的子代码
#     else:
#         # 3.创建存放用户的数据格式,因为考虑到多个用户,所以使用换行符\n 文本模式使用追加的模式
#         user_info = f'{username}|{password}\n'
#         with open(r'userinfo.txt', 'a', encoding='utf8') as f:
#             f.write(user_info)

# 3.编写用户登录功能
# 4.获取登录的用户名和密码
# username = input('请输入您的用户名>>>:').strip()
# password = input('请输入您的密码>>>:').strip()
# # 5.循环获取userinfo.txt中的用户数据
# with open(r'userinfo.txt', 'r', encoding='utf8') as f:
#     for i in f:
#         real_name, real_password = i.split('|')  # 切割用户数据
#         if username == real_name:
#             if password == real_password.strip('\n'):
#                 print(f'{username}登录成功')
#                 break
#     else:
#         print('用户名或密码错误,请重新输入')



posted @ 2022-06-29 22:27  dy12138  阅读(86)  评论(0)    收藏  举报