绝对路径:盘符开头并精确到目标文件,例如:f:\试用\实验.txt
相对路径:当前目录下的文件,例如:实验.txt
文件操作
ps:操作完成后一定要结束操作,使用s.close,避免持续占用内存空间。
open() open(“绝对路径或相对路径”,“模式”,“编码格式”)
r——只读:只是读取文件,不作任何更改。
s = open("f:\试用\实验.txt",mode="r",encoding="utf-8") q = s.read() print(q) s.close()
w——只写:若没有文件就创建文件,然后写入;若已有,那便清空内容重新写入。
s = open("f:\试用\实验.txt",mode="w",encoding="utf-8") s.write("你好世界") s.close()
a——追加:在已有的文件的内容后面追加新的内容。
s = open("f:\试用\实验.txt",mode="a",encoding="utf-8") s.write("你好世界") s.close()
操作非文字(图片,视频或其他)类型的文件时用bytes
rb——用byte数据类型读取文件
s = open("f:\试用\实验.txt",mode="rb") content = s.read() print(content) #输出的内容按byte类型输出,b’字母还是字母,中文用十六进制表示 s.close()
wb——用byte数据类型写入文件
s = open("f:\试用\实验.txt",mode="wb") s.write("你好世界".encode("utf-8")) #byte数据类型使用除了Unicode之外的数据类型进行储存 s.close()
ab——用byte数据类型追加写入
s = open("f:\试用\实验.txt",mode="ab") s.write("你好世界".encode("utf-8")) s.close()
双功能:
r+——读写,先读取文件,然后在文件内容后追加新的内容
s = open("f:\试用\实验.txt",mode="r+",encoding="utf-8") print(s.read()) s.write("阿瑞斯") #在r+模式下,此步骤可不写,运行程序后会表现为只读,不会报错 s.close()
如果在r+的模式下,先进行写然后再读取(将上面的中间两行代码互换)运行结果就会成为:输入n个字符就会从头开始覆盖原内容的n个字符(不是插入,也不是一次性删除所有内容然后写入)而读取的是未覆盖的内容,若新的字符将原字符完全覆盖,那么读取内容为空。
w+——写读,先将原内容清空,然后写入,并且毛都不会读出来,因为之前的操作已经将光标移动到末尾了(不常用)
用调光标【s.seek(0)括号内为字符索引,若为0便是将光标移到开头】的方法可以读取(详见a+的使用方法的演示代码)
s = open("f:\试用\实验.txt",mode="w+",encoding="utf-8") s.write("你好世界,nihaoma") print(s.read()) s.close()
a+——追加读取,先在原有的内容上追加新的内容,然后再读取,毛都读不出来,原因同上,解决方法同上
s = open("f:\试用\实验.txt",mode="a+",encoding="utf-8") s.write("你好世界") s.seek(0) #将光标移动到内容开头 print(s.read()) s.close()
操作非文字(图片,视频或其他)类型的文件时用bytes
r+b :使用bytes类型读写 ;w+b;使用bytes类型写读 a+b :使用bytes类型追加读取;
操作方法详解
read():读取,读取出来的都是字符,在括号内设定数字几,就可以设定读取多少字符。例如read(3)便是读取文件内容的3个字符
seek():定光标,按字节,括号内设定多少就是将光标定到那个字节的后面,例如Python3的字符是用Unicode进行储存的,每3个字节代表一个中文字符,若s.seek(3),那么光标将会定到文件内容的第一个中文字符的后面(不同的编码方式,每种字符的字节各不相同,使用前先看好)
tell():输出光标的位置
readable():是否可读(返回布尔值True、False)
readline():一行一行读
readlines():输出为列表,每一行当成列表中的一个元素,添加到列表中
truncate():对原文件进行截取,括号内若为5,那便截取原文件的前5个字符,其余清空。
想打印文件内容可以用for循环:先用open打开文件,然后循环变量(尽量别用这种方式,尤其是在不知道这个文件有多大时;尽量一行一行读)
为了避免忘记写close关闭文件,使其持续占用内存 或 想要一次性用不同的操作模式(mode)打开多个文件可以使用:
原代码:s = open(路径,mode,encoding)
with open(路径,mode,encoding) as 变量名(s) : #文件操作完成后自动关闭
with open(路径,mode,encoding) as 变量名(s) ,with open(路径,mode,encoding) as 变量名(f) : #打开多个文件,有缩进
其他方法见:http://www.cnblogs.com/jin-xin/articles/8183203.html
文件的修改:
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
方法一import os # 调用系统模块 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: data=read_f.read() #全部读入内存,如果文件很大,会很卡 data=data.replace('alex','SB') #在内存中完成修改 write_f.write(data) #一次性写入新文件 os.remove('a.txt') #删除原文件 os.rename('.a.txt.swap','a.txt') #将新建的文件重命名为原文件
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: for line in read_f: line=line.replace('alex','SB') write_f.write(line) os.remove('a.txt') os.rename('.a.txt.swap','a.txt') 方法二
来源:https://www.cnblogs.com/aries-zhang/p/10353326.html