the day of python learning(文件)

计算机系统分为:计算机硬件,操作系统,应用程序三部分。

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来

1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') 默认打开模式就为r

2. 通过句柄对文件进行操作
data=f.read()

3. 关闭文件
f.close()

关闭文件时,一种是关闭操作系统所打开的占内存的部分;另一种则是直接删除应用程序f文件

f.close()

del f  必须在close之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源。

也可以用with关键字来帮我们管理上下文

with open('a.txt','w') as f :

  pass

with open('a.txt','r') as read_f, open('b.txt','w') as write_f : 

  data = read_f.read()

  write_f.write(data)

文件的编码

以什么编码方式储存,就以什么方式打开

f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码就是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。

str------->>>byte encode 编码
r = '任阳城是帅哥'
s = r.encode('gbk') encode编码
print(s)

byte------>>str decode 解码
t =s.decode('gbk')
print(t)
英文字符解码编码都可以,因为占的字节都为一
s = 'abf'
b = s.encode('utf-8')
print(b)
byte --->str decode 解码
s1 = b.decode('gbk')
print(s1)

文件的操作

    a.txt
1,文件路径:d:a.txt
2,编码方式:utf-8 gbk 。。。。
3,操作方式:只读,只写,追加,读写,写读.....
以什么编码方式储存的文件,就得以什么编码打开进行操作。


绝对路径与相对路径
只读:r(文件必须存在,不存在则会异样)
bytes ---->> str
f = open('test',mode='r',encoding='utf-8')
content = f.read()
print(content,type(content))
f.close()

f = open('test',mode = 'rb',)
content = f.read()
print(content)
f.close()

只写:w(不可读,存在则清空内容再写,不存在则创建)
wb
先将源文件的内容全部清除,再写
f = open('无',mode='w',encoding='utf-8')
f.write('如果没有这个文件则创建,写的编码方式为utf-8')
f.close()
wb
f = open('无',mode='wb')
f.write('以字节的形式写入'.encode("utf-8"))
f.close()
r+ 读写
r+b 读写(以bytes类型)追加读写

f = open('log',mode='r+',encoding='utf-8')
print(f.read())
f.write('洋葱是笨蛋')
f.close()

f = open('log',mode='r+b')
print(f.read())
f.write('加油努力'.encode('utf-8'))
f.close()

只能追加a,ab(不可读;不存在则创建,存在则只追加内容
 f.close()

总结:

带+可以读写,相当于多一个功能

r+读写,w+写读,a+写读

带b用于非字符文件的传输,保存。'b'表示将其以字节的形式存储,使用这种模式无需考虑文本文件的字符编码、图片文件的ipg格式、视频文件的avi格式

rb,wb,ab

 注意点:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

以bytes类型操作的可读可写追加模式

r+b,w+b,a+b


文件的操作方法

4.1常用操作方法。

read(3):

  1.文件打开方式为文本模式时,代表读取三个字符

  2.文件打开方式为非文本模式(b),代表读取三个字节

其余的文件内光标移动都是以字节为单位的:

如seek,tell,truncate

注意点:

  1.seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论是哪种模式,都是以bytes为单位移动

  2.truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。

操作函数:

f.close()关闭文件

f.next()获取下一行数据,不存在则报错

f.read()读取指定字节数据

f.readline()仅仅读取一行数据

f.readlines()读取所有数据,并根据换行保存值列表

f.seek()指定文件中指针位置

f.tell()获取当前指针位置

f.truncate()截断数据,仅保留指定之前的数据

f.write()写数据

f.writelines()将一个字符串列表写入文件

f.xreadlines()可用于逐行读取文件,非全部

f.readable()判断是否可读

f.seekable()指针是否可操作

f.writable()是否可写

文件的修改

文件的数据是存放在硬盘上的,因而只存在覆盖,不存在修改一说。

文件是不可修改的,我们平时修改的只是系统模拟出来的效果

方式一:

将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕欧,再由内存覆盖到硬盘中(word,vim,nodpad++等编辑器)

import os 

with open('old') as read_file , open('new',mode = 'w') as write_file:

  data = read_f.read() #先全部读入内存,过大会造成系统卡死

  data = data.replace('原来的内容',’替换的内容‘)#在内存之后完成修改

  write_f .write(data)#一次性写入新的文件

os.remove('old')#移除原文件

os.rename('new','old') #将新的文件取名为原文件名。达到模拟修改效果

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕后就写入新的文件中,最后用新文件覆盖旧的文件

import os 

with open('old') as read_file , open('new',mode = 'w') as write_file:

   for line in read_file:

    line = line.replace('原来的内容','替换的内容')

    write_f.write(line)   #这里调用for循环,一边替换一边进行写入

os.remove('old')#移除原文件

os.rename('new','old') #将新的文件取名为原文件名。达到模拟修改效果