文件操作
基本操作流程
- 方法1:
1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
2. 通过句柄对文件进行操作
data=f.read()
3. 关闭文件
f.close()
- 方法2
此方法打开文件就不需要用close关闭了
with open("文件路径", "文件访问模式") as f:
- 文件访问模式
模式 | 说明 |
---|---|
r | 只读模式,不能写(文件必须存在,不存在会报错) |
w | 只写模式,不能读(文件存在会覆盖,文件不存在则创建,慎用) |
a | 追加模式,不能读(默认光标在文件尾部) |
r+ | 读写模式:在只读模式基础上增加了写权限 |
w+ | 写读模式:在写基础上增加读权限(慎用) |
a+ | 追加读模式 |
rb | 二进制读模式(针对非文本文件) |
wb | 二进制写模式(针对非文本文件) |
ab | 进制追加模式(针对非文本文件) |
rb+ | 二进制读写模式(针对非文本文件) |
wb+ | 二进制写读模式(针对非文本文件) |
ab+ | 二进制追加读模式(针对非文本文件) |
- 文件编码
- 操作系统会⽤⾃⼰的默认编码去打开⽂件,在windows下是gbk,在linux下是utf-8
python主要的访问模式示例
只读模式(r)
- 读取全文
read():从光标所在位置读取文件,读取到文件末尾
f = open("/root/1.txt")
data = f.read()
f.close()
print(data)
- 再次读取
f = open("/root/1.txt")
data1 = f.read()
data2 = f.read()
f.close()
print(data1)
print(data2)
发现:只能读取一次,第二次读取的内容为空
原因:第一次读取,光标从文件开始滑动到文件末尾;
再次读取时,光标在文件尾部,自然向下读取不到内容
解决:将光标再次移到文件开始f.seek(0)
f = open("/root/1.txt")
data1 = f.read()
f.seek(0)
data2 = f.read()
f.close()
print(data1)
print(data2)
查看光标所在位置(以字符计)
print(f.tell())
readline():从光标所在位置读取文件,读取到所在行的行尾
f = open("/root/1.txt")
data1 = f.readline()
print(f.tell())
print(data1)
data2 = f.readline()
print(f.tell())
print(data2)
f.close()
#执行结果
70
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
111
radvd:x:75:75:radvd user:/:/sbin/nologin
readline():从光标所在位置读取文件,读取到文件末尾,返回一个以行为元素的列表,大文件不推荐
f = open("/root/1.txt")
data1 = f.readlines()
print(f.tell())
print(len(data1))
print(data1[0]) #打印第一行
f.close()
#执行结果
568
10
ulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
- 去除换行符,打印第一行
方法1:
f = open("/root/1.txt")
data1 = f.readlines()
print(data1[0].strip())
f.close()
方法2:循环打印
f = open("/root/1.txt", mode="r")
for index, i in enumerate(f):
if index == 0:
print(i.strip())
f.close()
#执行结果
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
- 查找以“gdm”开头的行
f = open("/root/1.txt", mode="r")
for i in f:
if i.startswith("gdm"):
print(i.strip())
f.close()
#执行结果
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
- 查看linux系统内存的可用值
方法1:
f = open("/proc/meminfo", mode="r")
for i in f:
if i.startswith("MemAvailable"):
print(i)#help
print(i.split(" ")[-2])
f.close()
#执行结果
MemAvailable: 54328 kB
54328
方法2:
f = open("/proc/meminfo", mode="r")
for i in f:
if i.startswith("MemAvailable"):
print(i)#help
print(i.split(":")[1].strip())
f.close()
#执行结果·
MemAvailable: 46084 kB
46084 kB
只写模式(w)
- 案例:配置本地yum源
方法1:
f = open("/tmp/local.repo", mode="w")
f.write("[local]\n")
f.write("name=local\n")
f.write("baseurl=file:///mnt\n")
f.write("enable=1\n")
f.write("gpgcheck=0\n")
f.close()
方法2:
f = open("/tmp/local.repo", mode="w")
f.write("[local]\nname=local\nbaseurl=file:///mnt\nenable=1\ngpgcheck=0\n")
f.close()
方法3(推荐):
f = open("/tmp/local.repo", mode="w")
f.write('''[local]
name=local
baseurl=file:///mnt
enable=1
gpgcheck=0
''')
f.close()
#执行结果查看
[root@server1 ~]# cat /tmp/local.repo
[local]
name=local
baseurl=file:///mnt
enable=1
gpgcheck=0
写读模式(W+)
- 配置本地yum源
f = open("/tmp/local.repo", mode="w+")
f.write('''[local]
name=local
baseurl=file:///mnt
enable=1
gpgcheck=0
''')
f.seek(0) #注意光标位置
date = f.read()
print(date)
f.close()
#执行结果
[local]
name=local
baseurl=file:///mnt
enable=1
gpgcheck=0
读写模式(r+)
- 在/root/1.txt文件第2行与第3行之间插入hello
f = open("/root/1.txt", mode="r+")
f.readline()
f.readline()
f.write("hello\n")
f.seek(0)
date = f.read()
print(date)
f.close()
#执行结果
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
setroubleshoot:x:989:982::/var/lib/setroubleshoot:/sbin/nologin
sssd:x:988:981:User for sssd:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:987:980::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
hello
发现:hello插入到文件尾部,而不是插入到第二行后
原因:读与写的光标并不一致
解决:将写的光标与读的光标同步
f = open("/root/1.txt", mode="r+")
f.readline()
f.readline()
f.seek(f.tell())
f.write("hello\n")
f.seek(0)
date = f.read()
print(date)
f.close()
#执行结果
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
hello
bleshoot:x:989:982::/var/lib/setroubleshoot:/sbin/nologin
sssd:x:988:981:User for sssd:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:987:980::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
hello