python文件操作

文件操作

基本操作流程

  • 方法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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值