day3_文件读写
在python3里面只有这一种打开文件的方法,open('a.txt'),文件叫什么名字都行
文件打开的时候有三种方式(读、写、追加),默认是读的方式打开文件
读,用r表示,以读文件的方式打开的时候,如果文件不存在会报错;如果文件存在,而且不需要往文件里写东西的时候,用r打开,只要沾上r,文件不存在的时候就会报错
如f = open('a.txt'),如果a.txt不在当前目录下会报错,如果想不报错就创建一个a.txt,如果a.txt文件里有内容就会把内容读出来
f = open('a.txt', encoding='utf8')
print(f.read()) # 读取文件所有内容,读到内存中,返回的是一个字符串
print(f.readlines()) # 读取文件所有内容,返回的是一个list,list每个元素是文件的每一行
print(f.readline()) # 每次只取一行内容,要取多行内容,要多次执行print(f.readline())
写,用w表示,以写文件的方式打开的时候,如果文件不存在,会新建一个文件;如果文件存在会把之前的文件内容清空,然后会读不到内容报错,只要沾上w,就会清空以前的文件内容
f = open('a.txt', 'w', encoding='utf8')
print(f.read())
f = open('a.txt', 'w', encoding='utf8')
f.write('哈哈哈哈') # write是写内容,只能写字符串
f.writelines(['123\n', '345']) # writelines()方法写入的是可迭代对象,如list,str,tuple,dict,写入字典的话只能把key写进去,要想全部写进去,要转换成字符串
f = open('a.txt', 'r+', encoding='utf8') # r+是读写模式
f.write('哈哈哈哈') # 会把之前文件里第一行的相同长度的内容覆盖掉,如果文件里内容少于写入的字符串,全部覆盖
f = open('a.txt', 'w+', encoding='utf8') # w+是写读模式
f.write('哈哈哈哈') # 会把之前文件里所有的内容覆盖掉
f.seek(0) # 移动文件指针
print(f.read())
r+,能读能写,如果文件不存在会报错
w+,能读能写,会把之前的内容清空
追加,用a表示,a的好处是没有文件会创建文件,也不会清空以前的文件内容,也不报错
f = open('b.txt', 'a', encoding='utf8')
f.write('哈哈哈哈')
f.seek(0) # 移动文件指针
print(f.read())
追加(a)模式只能写,不能读,运行的时候会报错
# a+是追加读写模式
f = open('b.txt', 'a+', encoding='utf8')
f.write('哈哈哈哈')
f.seek(0) # 移动文件指针
print(f.read())
追加读写(a+)模式既能写,又能读,不会清空以前的内容
f = open('b.txt', 'a+', encoding='utf8')
print(f.read())
执行上面两行会为空显示,因为a+模式是从文件的末尾追加,读的时候会显示空内容,要想读到内容必须加上f.seek(0)才能读出来
如何将一个文件对象(f)中的数据存放到列表中?
f = open('rank.py', encoding='utf8')
res = list(f)
print(res) # 打印出一个列表,每个元素是文件的每一行
文件对象的内置方法f.read([size=-1])作用是读取文件对象内容,size参数是可选的,那如果设置了size=10,例如f.read(10),将返回什么内容呢?
将返回从文件指针开始(注意这里并不是文件头哦)的连续10个字符,f.read(-1)返回从文件指针开始的全部内容
编写代码,将文件a.mp4保存为新文件a.txt
f1 = open('a.mp4', encoding='utf8')
f2 = open('a.txt', 'w', encoding='utf8')
f2.write(f1.read())
f2.close()
f1.close()
with open('b.txt', 'a+', encoding='utf8') as f: # 运行完成后,with可以自动关闭文件
f.seek(0)
for line in f:
print(line)
with open('a.txt','a+',encoding='utf8') as f,open('b.txt','a+',encoding='utf8') as f2: # 打开多个文件的方法
user_info = {
'jmy': {'money': 100,
'height': 180,
'password': '123456'},
'agr': {'money': 30,
'height': 190,
'password': '123456'}
}
f = open('users.txt', 'a+', encoding='utf8')
f.write(user_info) # 第一种情况,运行会报错,因为write写入的是字符串,而现在是字典要写到users.txt里
print(str(user_info)) # 第二种情况,强制类型转换成字符串,虽然能读出来但是没写进去
f.seek(0) # 第三种情况,把文件指针移到最开始
print(f.read()) # 第三种情况,没有写进去,什么也读不到
f.write(str(user_info)) # 第四种情况,写到文件里了,但是写进去的是一个字符串
f.seek(0) # 第五种情况,把文件指针移到最开始
print(f.read()) # 第五种情况,读出来了
f.seek(0) # 第六种情况,把文件指针移到最开始
print(type(f.read())) # 第六种情况,查看类型,发现是字符串类型,字符串类型不好取值
f.seek(0) # 第七种情况,把文件指针移到最开始
print(dict(f.read())) # 第七种情况,转换类型,报错,不能转换
f.seek(0) # 第八种情况,把文件指针移到最开始
print(eval(f.read())) # 第八种情况,转换类型,字符串转换成字典类型
f.seek(0) # 第九种情况,把文件指针移到最开始
new_user_info = eval(f.read()) # 第九种情况,转换类型,验证是否已转换成字典类型
print(type(new_user_info)) # 第九种情况,转换成功,打印出< class‘dict’>
f.seek(0) # 第十种情况,把文件指针移到最开始
new_user_info = eval(f.read()) # 第十种情况,在users2.txt里输入一个list
print(type(new_user_info)) # 第十种情况,转换成功,打印出< class‘list’>
同理在users2.txt里输入一个tuple/string,会打印出< class‘tuple/'str' >
怎么把字典存到文件里面,通过字符串的形式把字典存进文件(将字典转换成字符串),然后再把字符串转换成字典读出来(再将字符串转换成字典)
修改文件的方式:f.seek(0),f.truncate() # 清空文件所有内容
f.flush() # 刷新缓冲区,把缓冲区的内容写到磁盘里
获取文件对象(f)当前文件指针的位置 # f.tell()