一、文件读写操作

1、txt文件

  • 常见文件的要素
  1. 文件路径(绝对路径/相对路径)
  2. 文件编码方式(UTF-8,GBK,GB2312==)
  3. 操作类型(只读,只写,追加,读写,写读)

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('用户名/密码错误,请重试')