Python基础--文件操作
文件操作
使用open函数加载文件到内存
注:文件打开以后,在使用完毕后应当关闭打开的文件,以免占用内存
例如:
# 参数1:是需要打开的文件的位置,可以是绝对路径,也可以是相对路径。
# 参数2:mode可设置多种值,r、rb、r+、w、wb、w+、a、ab、a+ 。具体这些值代表什么意思,后面说明。
# 参数3:encoding,表示使用什么编码格式打开文件,文件是什么格式就用什么格式打开。
f = open('d:/文件操作测试文件.txt', mode='r' ,encoding='utf-8') #打开文件
print(f.read()) #读取文件
f.colse() #关闭文件
参数1:mode
只读
r mode='r' 时,文件对象只能进行读取操作,不能进行其他操作
rb mode='rb' 时,文件对象只能以二进制的形式进行读取操作,不能进行其他操作
以二进制读取,展示是转换为b'...'的格式
如果文件文件里存的是字母,那个就显示为b'abcde...'
如果文本文件里存的是汉字,这把汉字转换为16进制进行显示,b'x02x05'
使用rb时不再需要指定编码,如果指定会报错
# 假设在当前目录下存在一个utf-8编码的txt文件,里面的内容如下
# this is abc
# 这是汉字
# r
f = open('文件操作测试文件', mode='r' ,encoding='utf-8') #打开文件
print(f.read()) #读取文件
f.colse() #关闭文件
-------------------------------------------------------
abc
汉字
-------------------------------------------------------
# rb ,使用rb时不再需要指定编码,如果指定会报错
f = open('文件操作测试文件', mode='rb' ) #打开文件
print(f.read()) #读取文件
f.colse() #关闭文件
-------------------------------------------------------
b'abc\r\n\xe6\xb1\x89\xe5\xad\x97'
-------------------------------------------------------
只写
w mode='w' 时,文件对象只能进行写入操作,不能进行其他操作
如果文件不存在,则创建文件
如果文件存在,则从清空文件再写入
wb mode='wb' 时,文件对象只能以二进制的形式进行写入操作,不能进行其他操作
如果文件不存在,则创建文件
如果文件存在,则从清空文件再写入
使用wb写入时,需要先将字符串转为二进制
使用wb时不再需要指定编码,如果指定会报错
# 假设“文件操作测试文件” 不存在
# w
f = open('文件操作测试文件', mode='w', encoding='utf-8')
f.write('abcdefg')
f.close()
-------------------------------------------------------
-------------------------------------------------------
# wb
f = open('文件操作测试文件', mode='wb')
f.write('测试'.encode())
f.close()
-------------------------------------------------------
-------------------------------------------------------
追加
a mode='a' 时,文件对象只能进行追加操作,不能进行其他操作
默认从光标结尾处追加。
ab mode='ab' 时,文件对象只能以二进制的形式进行追加操作,不能进行其他操作
默认从光标结尾处追加。
使用ab写入时,需要先将字符串转为二进制
使用ab时不再需要指定编码,如果指定会报错
# 假设“文件操作测试文件” 存在,其内容为:
# abc
# 测试
# a
f = open('文件操作测试文件', mode='a', encoding='utf-8')
f.write('一下')
f.close()
-------------------------------------------------------
#内容变为:
abc
测试一下
-------------------------------------------------------
# ab
f = open('文件操作测试文件', mode='ab')
f.write('二下'.encode())
f.close()
-------------------------------------------------------
#内容变为:
abc
测试一下二下
-------------------------------------------------------
读写
r+ mode='r+' 时,可以对文件进行读取和写入操纵
先读后写
先写后读
r+b mode='r+b' 时,可以以二进制的方式对文件进行读取和写入操纵
# 假设“文件操作测试文件” 存在,其内容为:
# abc
# 测试
# r+ 先读后写
f = open('文件操作测试文件', mode='r+', encoding='utf-8')
print(f.read()) #读取完光标在文件的最后位置
f.write("一下") #从光标所在位置写入
f.close()
-------------------------------------------------------
#read 输出内容
abc
测试
#文件内容变为:
abc
测试一下
-------------------------------------------------------
# r+ 先写后读
f = open('文件操作测试文件', mode='r+', encoding='utf-8')
#从光标所在位置写入(默认位置在文件开头),写完后光标移动到6,
#因为一个汉字在utf-8里占3个字节,一个字节一个光标位。所以2个汉字移动6个光标位。
#UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 0: invalid start byte
# 错误原因就是:先写是从光标0位置开始写,写2个汉字需要6个字节。
# 而源文件中第一行为abc3个字节,然后是换行,新写入的6个字节的后3位把换行覆盖了一部分,
# 导致信息无完整,故提示错误
f.write("一下")
print(f.read()) #读取完光标在位置之后的内容
f.close()
-------------------------------------------------------
#文件内容变为:
abc
测试一下
#read 输出内容
abc
测试
-------------------------------------------------------
写读
w+ mode='w+' 时,可以对文件进行读取和写入操纵
先读后写
先写后读
w+b mode='w+b' 时,可以以二进制的方式对文件进行读取和写入操纵
追加读
a+ mode='a+' 时,可以对文件进行读取和追加操纵
先读后写
先写后读
a+b mode='a+b' 时,可以以二进制的方式对文件进行读取和追加操纵
功能详解
读取全部内容
f = open('文件操作测试文件', mode='r+', encoding='utf-8')
print(f.read())
f.close()
按字符读取文件
文件里存的 abcd 那么:read(3) abc
文件里存的 天马行空 那么:read(3) 天马行
f = open('文件操作测试文件', mode='r+', encoding='utf-8')
print(f.read(3))
f.close()
光标位置调
光标调节是按字节调节
为什么f.seek(2)报错? 因为一个汉字3字节
f = open('文件操作测试文件', mode='r+', encoding='utf-8')
f.seek(3) #将光标调节到3
print(f.read())
f.close()
获取光标位置
#需求:在文件的末尾追加(汉字)后打印后面3个字符
f = open('文件操作测试文件', mode='a+', encoding='utf-8')
f.write('测试') #追加完,光标在文件的最后
count = f.tell() #获取光标位置
f.seek(count-9) #为什么是 -9 ? 一个汉字3字节
print(f.read(3))
f.close()
判断文件是否可读
f.readable()
读一行
f.readline() --> str #一行一行的读 str
f.readlines() --> list #每一行作为一个元素,返回一个列表
截断文件并返回截断的字节长度
f.truncate()
循环
#循环方式1
f = open('文件操作测试文件', mode='a+', encoding='utf-8')
#工作中不要这样读取,不知道文件大小的情况下很容易把内存撑爆
for line in f:
print(line)
f.close()
#循环方式2 ()
#用这种方法,不必手动close(),此中方法可自动关闭文件
with open('文件操作测试文件', mode='a+', encoding='utf-8') as f:
print(f.read())
# 打开多个文件
with open('file1', mode='a+', encoding='utf-8') as f1,\
open('fiel2', mode='a+', encoding='utf-8') as f2:
print(f1.read())
print(f2.read())
练习题
功能:用户注册和登录
注册成功写入文件
登录从文件中读取,并与用户输入的进行对比
# 注册
while 1:
username = input('请输入用户名:').strip()
password1 = input('请输入密码:').strip()
password2 = input('再次输入密码:').strip()
if password1 == password2 :
print('注册成功')
with open('list_of_info', mode='w', encoding='utf-8') as f:
f.write('{}\n{}'.format(username, password1))
break
else:
print('两次输入的密码不一致,请重新输入')
# 登录
i = 0
users = []
while i < 3:
usn = input('登录用户:')
pwd = input('登录密码:')
with open('list_of_info', mode='r+', encoding='utf-8') as f1:
for j in f1:
users.append(j)
if usn == users[0].strip() and pwd == users[1].strip():
print('登录成功')
break
else:
print('用户名或密码错误')
i += 1