7.python文件操作

1 什么是文件

文件是操作系统为用户/应用程序提供的一种操作硬盘的抽象单位

2 为何要用文件

用户/应用程序对文件的读写操作会由操作系统转换成具体的硬盘操作
所以用户/应用程序可以通过简单的读\写文件来间接地控制复杂的硬盘的存取操作
实现将内存中的数据永久保存到硬盘中
内存
    user=input('>>>>: ') #user="老铁"

3 如何用文件

文件操作的基本步骤:

f=open(...) #打开文件,拿到一个文件对象f,f就相当于一个遥控器,可以向操作系统发送指令
f.read() # 读写文件,向操作系统发送读写文件指令
f.close() # 关闭文件,回收操作系统的资源
#上下文管理:
with open(...) as f:
	pass

绝对路径

f=open(r'D:\python代码6\day7\a.txt',encoding='utf-8')
f1 = f.read()
f.close()

相对路径

f = open('./a.txt',encoding='utf-8')
f1=f.read()
print(f1)
f.close()

当前路径省略./ 最常用

f = open('a.txt',encoding='utf-8')
f1=f.read()
print(f1)
f.close()

上一级

f = open('../day7/a.txt',encoding='utf-8')
f1=f.read()
print(f1)
f.close()

加粗样式根目录

f = open(r'\python代码6\day7\a.txt',encoding='utf-8')
f1=f.read()
print(f1)
f.close()

上下文管理常用写法:*

with open(...) as f:
	pass

可以自动关闭文件常用写法*

with open(r'D:\python代码6\day7\a.txt',encoding='utf-8')as f:
    print(f.read())

4文本操作的常用模式

一 文件的打开模式
    r: 只读模式(默认的)
    w: 只写模式
    a: 只追加写模式
二 控制读写文件单位的方式(必须与r\w\a连用)
    t : 文本模式(默认的),一定要指定encoding参数
        优点: 操作系统会将硬盘中二进制数字解码成unicode然后返回
        强调:只针对文本文件有效
    b: 二进制模式,一定不能指定encoding参数
        优点: 不用指定字符编码,视频,图片文件

判断是否可读可写

print(f.readable())		是否可读,返回true/false
print(f.writable())		是否可写,返回true/false

mode=‘rt’ 只读模式下
1 当文件不存时,会报错
2 当文件存在时,文件指针指向文件的开头

with open(r'D:\python代码6\day7\a.txt', mode='rt',encoding='utf-8')as f:
f.readline()	#只读一行
f.readlines()	#read文件太大,不好!,只读一行,并且存人数组

mode=‘wt’ 只写模式下
1 当文件不存时,新建一个空文档(无则创建)
2 当文件存在时,清空文件内容,文件指针跑到文件的开头(有则清空)

with open(r'D:\python代码6\day7\a.txt', mode='wt',encoding='utf-8')as f:
f.write('老铁')
f.writeline(列表)

mode=‘at’ 只追加写模式下
1 当文件不存时,新建一个空文档,文件指针跑到文件的末尾(开头就是末尾)
2 当文件存在时,文件指针跑到文件的末尾

with open('c.txt',mode='at',encoding='utf-8')as f:
pass

二进制文件 b 模式 图片和视频和字符编码没关系
打开图片文件没有encoding解码一说
读 rb

with open('1.png',mode='rb') as f:
	data = f.read()
	print(data)
	print(type(data))

写 wb

with open('2.png',mode='wb') as f:
	f.write(data)

用b模式,也可以对文本文件操作,但是要解码

with open('b模式.txt',mode='rb')as f:
data=f.read()
print(data)
# decode   二进制解码成字符
print(data.decode('utf-8'))   

#编码  写的时候把字符转换成二进制写入

with open('wb模式.txt',mode='wb')as f:
	f.write('老铁\n'.encode('utf-8'))
	f.write('老铁\n'.encode('utf-8'))
	f.write('老铁\n'.encode('utf-8'))

5可读可写模式

r+t
1 当文件不存时,会报错
2 当文件存在时,文件指针指向文件的开头
3 多了个末尾写

with open('可读可写r+t模式.txt',mode='r+t',encoding='utf-8')as f:
	print(f.readable())
	print(f.writable())
	msg = f.readline()
	print(msg)
	f.write('xxxxxxxxxxxxxxx')

w+t
1 当文件不存时,新建一个空文档(无则创建)
2 当文件存在时,清空文件内容,文件指针跑到文件的开头(有则清空)
3 可以读

with open('可读可写w+t模式.txt',mode='w+t',encoding='utf-8')as f:
	print(f.readable())
	print(f.writable())
	f.write('aaaaaaaaaaaa\n')
	f.write('bbbbbbbbbbbb\n')
	#根据指针读
	#指针移动seek(移动的字节数,开头开始0)
	#从开头开始移动0
	#读不到
	print(f.readline())
	f.seek(0,0)
	print(f.readline())
	#还是在末尾写
	f.write('ccccccccccc')

a+t
第二次打开时候也是在末尾写

with open('可读可写a+t模式.txt',mode='a+t',encoding='utf-8')as f:
	print(f.readable())
	print(f.writable())
	f.write('aaaaaaaaaaaa\n')
	f.write('bbbbbbbbbbbb\n')
	#根据指针读
	#指针移动seek(移动的字节数,开头开始0)
	#从开头开始移动0
	#读不到
	print(f.readline())
	f.seek(0,0)
	print(f.readline())
	#还是在末尾写
	f.write('ccccccccccc')

6文件指针

f.seek *****
文件内指针移动,只有t模式下的read(n),n代表的字符的个数
b模式文件内指针的移动都是以字节为单位

t模式 read(n)字符的个数

with open('指针移动.txt',mode='rt',encoding='utf-8')as f:
	print(f.read(1))
	print(f.read(1))
	print(f.read(1))
	print(f.read(1))
	print(f.read(1))

b模式 read(n)# b模式文件内指针的移动都是以字节为单位

with open('指针移动.txt',mode='rb')as f:
	print(f.read(1).decode('utf-8'))
	print(f.read(1).decode('utf-8'))
	#三分之一个汉字 (中文需要3个字节)
	print(f.read(3).decode('utf-8'))
	print(f.read(3).decode('utf-8'))
	print(f.read(3).decode('utf-8'))

指针操作

f.seek(offset,whence)有两个参数:
offset: 代表控制指针移动的
whence: 代表参照什么位置进行移动字节数
whence = 0: 参照文件开头(默认的),特殊,可以在t和b模式下使用
whence = 1: 参照当前所在的位置,必须在b模式下用
whence = 2: 参照文件末尾,必须在b模式下用

t模式 移动的字节数算 读的按照字符算

with open('seek.txt',mode='rt',encoding='utf-8')as f:
	f.seek(2,0)
	print(f.read(1))

b模式 移动的字节数 读的也是字节数

with open('seek.txt',mode='rb')as f:
	f.seek(2,0)
	print(f.read(3).decode('utf-8'))
	whence = 1: 参照当前所在的位置,必须在b模式下用
	whence = 2: 参照文件末尾,必须在b模式下用
	
with open('seek.txt',mode='rb')as f:
	msg = f.read(5)
	print(msg.decode('utf-8'))
	print(f.tell())	#查看指针的位置
	f.seek(3,1)
	print(f.read(3).decode('utf-8'))

whence = 2: 参照文件末尾,必须在b模式下用

with open('seek.txt',mode='rb')as f:
    f.seek(0,2)
    print(f.tell())	#查看指针的位置
    f.seek(-3, 2)
    print(f.read(3).decode('utf-8'))

7文件修改

修改文件的方式一:
1 将文件内容由硬盘全部读入内存
2 在内存中完成修改
3 将内存中修改后的结果覆盖写回硬盘

with open('文件修改.txt',mode='rt',encoding='utf-8')as f:
	all_data = f.read()
	print(all_data)
with open('文件修改.txt',mode='wt',encoding='utf-8')as f:
	f.write(all_data.replace('红黄蓝','老铁'))

修改文件的方式二:
1 以读的方式打开源文件,以写的方式打开一个临时文件
2 从源文件中每读一样内容修改完毕后写入临时文件,直到源文件读取完毕
3 删掉源文件,将临时文件重命名为源文件名

import os
with open('文件修改二.txt',mode='rt',encoding='utf-8')as read_f , open('临时文件.txt',mode='wt',encoding='utf-8') as write_f:
	for line in read_f:
		write_f.write(line.replace('老铁','vib'))
		
#文件修改二删除
os.remove('文件修改二.txt')

#临时文件.txt 改成 文件修改二
os.rename('临时文件.txt','文件修改二.txt')

方式一:
优点: 在文件修改的过程中硬盘上始终一份数据
缺点: 占用内存过多,不适用于大文件

方式二:
优点: 同一时刻在内存中只存在源文件的一行内容,不会过多地占用内存
缺点: 在文件修改的过程中会出现源文件与临时文件共存,硬盘上同一时刻会有两份数据,即在修改的过程中会过多的占用硬盘

8如何避免乱码

天生我才必有用
日语

with open('test.txt',mode='wt',encoding='shift_jis')as f1:
	f1.write('うまれつき生まれつきわたくし私こそかならず必ずやく役にたつ立つ')
with open('test.txt',mode='rt',encoding='shift_jis')as f1:
	a = f1.read()
	print(a)

!!!总结非常重要的两点!!!

1、保证不乱码的核心法则就是,字符按照什么标准而编码的,
就要按照什么标准解码,此处的标准指的就是字符编码
2、在内存中写的所有字符,一视同仁,都是unicode编码,比如我们打开编辑器,
输入一个“你”,我们并不能说“你”就是一个汉字,此时它仅仅只是一个符号,
该符号可能很多国家都在使用,根据我们使用的输入法不同这个字的样式可能也不太一样。
只有在我们往硬盘保存或者基于网络传输时,
才能确定”你“到底是一个汉字,还是一个日本字,这就是unicode转换成其他编码格式的过程了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值