文件处理
小试牛刀
文件句柄=open(文件路径,mode=文件的打开模式,encoding=字符编码)
with open('aaa.txt',mode='r',encoding='utf-8') as f: print(f.readable()) print(f.read()) f.closed>>>True>>>你好,世界之窗
该地方采用相对路径,若采用绝对路径,需要加转义符r
默认就是mode=r 只读
以上操作涉及两方面的资源- 操作系统需要打开文件
- f就是一个python 的变量
Character | Meaning |
---|---|
‘r' | open for reading (default) |
‘w' | open for writing, truncating the file first |
‘a' | open for writing, appending to the end of the file if it exists |
‘b' | binary mode |
‘t' | text mode (default) |
‘+' | open a disk file for updating (reading and writing) |
‘U' | universal newline mode (for backwards compatibility; should not be used in new code) |
文件的两种打开模式
1、 默认为文本模式
r: 默认的打开模式,只读模式,文件如果不存在则报错
w: 只写模式,不可读,不存在则创建,存在则清空内容复写 a:只追加写模式,(写模式的一种)不可读,不存在则创建,存在则只追加内容,不复写。指针直接到末尾,通常用于记录logwith open ('aaa.txt',mode='r',encoding='utf-8') as f: print(f.readline()) #只读一行,并把光标移动到下一行的首位置,可连续放n行可以读取n行数据 print(f.readlines()) #将文件内容全部读出并放于列表内 >>>你好,>>>>>>['你好,\n', '世界之窗\n', '我来了']with open('111.txt',mode='w',encoding='utf-8') as f: f.write('hello') print(f.writable()) L=['bruce',"said,he couldn't be caged"] print(f.writelines(L))with open('222.txt',mode='a',encoding='utf-8') as f: print(f.readable()) print(f.writable()) f.write('你好\n 这世界,我来了')
a 写模式的一种,
2、非文本模式(b模式,即二进制)
比如mp3,mp4,jpg等格式,只能用b模式,b表示以字节的方式操作,无需考虑字符编码。以b方式打开时,读取的内容是字节类型,写入时也需要提供字节类型,不能指定编码
with open('4.jpg',mode='rb') as f: print(f.readable()) print(f.writable()) print(f.read()) >>True>>>False
"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
a+, 写读【可读,可写】
f.read() #读取所有内容,光标移动到文件末尾f.readline() #读取一行内容,光标移动到第二行首部f.readlines() #读取每一行内容,存放于列表中f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符f.writelines(['333\n','444\n']) #文件模式f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式f.readable() #文件是否可读f.writable() #文件是否可读f.closed #文件是否关闭f.encoding #如果文件打开模式为b,则没有该属性f.flush() #立刻将文件内容从内存刷到硬盘f.name
文件内光标移动
一: read(3):
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
3.文件的修改
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
import oswith 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 oswith 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')