一、文件读写操作
1、txt文件
- 常见文件的要素
- 文件路径(绝对路径/相对路径)
- 文件编码方式(UTF-8,GBK,GB2312==)
- 操作类型(只读,只写,追加,读写,写读)
2、读写文件注意事项
- pycharm的默认编码格式是utf-8,Windows电脑默认创建的文件编码格式是gbk
- 文件的编码方式是什么,则必须用相同的编码方式去打开该文件,否则会报错
- 打开文件,可以选择相对路径/绝对路径,绝对路径必须带.txt(文件类型)
- 文件打开并结束操作之后必须关闭文件,使用 f.close()的方法
3、文件的读,只读:mode = 'r',mode = 'rb'(不需要加入encoding的参数,默认文件是什么格式,就以什么格式输出)
- 非文字类的文件/上传下载/储存下载的操作,需要用到'rb'的编码格式,输出结果是以bytes类型输出
- 读文件,要先打开文件再读文件。若打开的文件不存在,则会报错
- 读文件,输出结果是str类型(Python3存储的文件是UNICODE类型的str,封装了一个操作,将其转化为bytes类型,再将其转化为UTF-8的str)
- mode = 'r',encoding参数默认为None,使用编译器的默认编码方式
f = open('wj_我是一个txt文件',mode='r',encoding='utf-8') #打开文件,只读
content = f.read() #读取文件
print(content,type(content))
f.close() #关闭文件,避免对象一直在内存中
- mode = 'rb',open操作的时候不需要encoding的参数
f = open('wj_我是一个txt文件',mode='rb') #打开文件,只读
content = f.read() #读取文件
print(content,type(content))
f.close() #关闭文件,避免对象一直在内存中
4、文件的写,只写:mode = 'w',mode = 'wb',将文件全部清除再写,基本没有用
- 写文件,要先打开文件再写文件。若open操作的参数文件不存在,则会直接创建一个
- 写文件的时候,若write操作的参数为空,则会报错
- 写文件的时候,若write操作的参数不为空,则会清空原文件的内容,再写入
- 文件的编码方式是什么,则必须用相同的编码方式去写该文件,否则会报错
- 使用write操作的时候,会报错
- mode = 'w',encoding参数默认为None,使用编译器的默认编码方式
f = open('wj_我是一个txt文件',mode='w',encoding='utf-8') #若文件不存在,则默认直接创建一个
f.write('我是王静') #参数为空则报错,参数不为空则先将原文件内容全部清除,再写入
f.close()
mode = 'wb',open操作的时候不需要encoding的参数,write操作的时候需要将字符串转化为和 文件编码方式相同的编码方式(注意内存中只使用UNICODE的编码方式,存储的时候是 非UNICODE编码方式的)
f = open('wj_我是一个txt文件',mode='wb') #若文件不存在,则默认直接创建一个
f.write('我是王静111'.encode('utf-8')) #参数为空则报错,参数不为空则先将原文件内容全部清除,再写入
f.close()
5、文件的追加:mode = 'a',mode = 'a'(以bytes类型追加)
- 追加文件,要先打开文件再追加文件。若open操作的参数文件不存在,则追加操作无效
- 写文件的时候,若write操作的参数为空,则会报错
- 写文件的时候,若write操作的参数不为空,则会在当前文件向后追加,不会自动换行哦
- 文件的编码方式是什么,则必须用相同的编码方式去写追加文件,否则会报错
- 使用read操作的时候,会报错
- mode = 'w',encoding参数默认为None,使用编译器的默认编码方式
f = open('wj_我是一个txt文件',mode='a',encoding='utf-8') #若文件不存在,则默认直接创建一个
f.write('追加1111') #参数为空则报错,参数不为空则先将原文件内容全部清除,再写入
f.close()
- mode = 'wb',open操作的时候不需要encoding的参数,write操作的时候需要将字符串转化为和 文件编码方式相同的编码方式(注意内存中只使用UNICODE的编码方式,存储的时候是 非UNICODE编码方式的)
f = open('wj_我是一个txt文件',mode = 'ab')
f.write('追加222'.encode('utf-8'))
f.close()
6、文件的读写:mode = 'r+',mode = 'w+',mode = 'a+'(mode = 'r+b',mode = 'w+b',mode = 'a+b')
- mode = 'r+',可读可写(需要结合光标的处理使用)
- mode = 'w+',可写可读(需要结合光标的处理使用)----将文件全部清除再写,基本没有用
- mode = 'a+',可追加可读(需要结合光标的处理使用)
二、文件其他操作
1、f.read() #一次性读取整个文件,带参数的话,参数指的是读取的str个数。read方法读出来的都是str
2、f.write() #写操作/追加操作
3、f.seek(3) #修改光标位置,seek和tell是按照字节去定光标位置的,文件中有中文的话可能会报错(3的倍数一般不会报错)
4、f.tell() #查询当前的光标位置
5、f.readable() #判断是否可读
6、f.writable() #判断是否可写
7、f.readline() #读取当前行,当前光标后的全部内容
8、f.readlines() #多行读取,输出结果为列表,每一行为列表中的一个元素
9、常用的读写操作:
• f = open('wj_我是一个txt文件',mode='r',encoding='utf-8')
• f = open('wj_我是一个txt文件',mode='r+',encoding='utf-8')
• f = open('wj_我是一个txt文件',mode='a+',encoding='utf-8')
f = open('wj_我是一个txt文件',mode='a+',encoding='utf-8')
f.write('王静')
count = f.tell()
print(count)
f.seek(count - 12)
print(f.read(2))
- 一行一行的输出,用for循环来做
f = open('wj_我是一个txt文件',mode='a+',encoding='utf-8')
#一行一行的输出,方法1
f.seek(0)
for i in f.readlines():
print(i)
#一行一行的输出,方法2
f.seek(0)
for line in f:
print(line)
f.close()
10、最常用和最方便的在这里
with open('wj_我是一个txt文件',mode='r+',encoding='utf-8') as obj,\
open('wj_我是一个txt文件',mode='r+',encoding='utf-8') as obj1:
#可防止忘记close文件,可一次打开多个文件
print(obj.read())
print(obj1.read())
课后作业
1、先注册,注册结果写到txt文件,并打印
2、三次登录,读取文件验证
'''
作业
1、先注册,注册结果写到txt文件,并打印
2、三次登录,读取文件验证
'''
print('以下进入注册流程'.center(50,'='))
user = ''
while 1:
name = input('请输入您的用户名:')
if name.upper() == 'Q':
print('结束注册,请登录')
break
pwd = input('请输入您的密码:')
if pwd.upper() == 'Q':
print('结束注册,请登录')
break
elif len(name) <= 10 and len(name) >= 6 and len(pwd) <= 10 and len(pwd) >= 6:
with open('wj_users', mode='a', encoding='utf-8') as txt_users:
txt_users.write('{},{}\n'.format(name,pwd))
print('恭喜您注册成功')
else:
print('用户名/密码不符合规范,请重新注册')
print('以下进入登录流程'.center(50,'='))
dict_user = {}
with open('wj_users',mode='r',encoding='utf-8') as txt_users:
for line in txt_users:
dict_user[line[:line.find(',')]] = line[line.find(',')+1:].strip()
time = 3
while time > 0:
input_name = input('请输入您的用户名:')
input_pwd = input('请输入您的密码:')
time -= 1
if input_name in dict_user.keys() and input_pwd == dict_user[input_name]:
print('恭喜您登录成功')
break
else:
if time <= 0:
print('用户名/密码错误,您没有登录机会,强制退出成功')
else:
print('用户名/密码错误,请重试')