python:I/O操作:文件读写

在python中如何读取linux系统中某个目录下的文件?读取后如何写入内容呢?

首先认识一下各种读写方式:
++++++++++++++++++++++++++++++++++++++++++++
【r:(默认)】
-只能读,不能写
-读取的文件不存在,会报错
读完指针停留在文件最后
++++++++++++++++++++++++++++++++++++++++++++
【r+:】
-可读写
-文件不存在,报错
-默认从文件指针所在位置开始写入
读完指针停留在文件最后
++++++++++++++++++++++++++++++++++++++++++++
【w:】
-只能写
-会清空文件之前的内容
-相当于重定向
-文件不存在,不会报错,会创建新的文件并写入
写完指针停留在文件最后
++++++++++++++++++++++++++++++++++++++++++++
【w+:】
-可读写
-会直接先清空文件内容
-相当于重定向
-文件不存在,不会报错,会创建新的文件并写入
写完指针停留在文件最后
++++++++++++++++++++++++++++++++++++++++++++
【a:】
-只能写
-文件不存在,不报错
-不会清空文件内容
-相当于追加
++++++++++++++++++++++++++++++++++++++++++++
【a+:】
-可读写
-文件不存在,不报错
-不会清空文件内容
-相当于追加
++++++++++++++++++++++++++++++++++++++++++++

对文件的使用:读:

步骤:
打开 —> 操作 —> 关闭
示例:

f = open('/tmp/passwd')  
#首先我们先确认有/tmp/passwd这个文件
content = f.read()  #将读取到的内容赋给content变量
prient(content)   #打印读取到的内容
f.close()  #关闭文件

在这里插入图片描述
这样就达成了在python中直接读取我们主机文件的功能。
我们上面有说r是默认的选择,即只读,不能写。
在这里插入图片描述
可以看到,产生不可写的报错。

我们可以使用:变量.readable()查看是否可读 || 变量.writeable()查看是否可写
在这里插入图片描述
当文件被读取过一次时,指针会移到文件的最后,那么第二次读取时则读不到内容了。
在这里插入图片描述
上面这个例子中,本希望读取到两次的/tmp/passwd文件,结果只读到了一次。
我们可以通过调节指针位置来达到二次读取:
在这里插入图片描述

指针位置在7是因为文件中还有一个$来指示结尾。
在这里插入图片描述


对文件的使用:写:

f = open('/tmp/passwd','w')
#w有写的权限,但是不可以读,且w在写之前会清空原文件内容

f.write('redhat')#写入一个字符串redhat

f.close()

运行结果:无报错,但是清空了我们原文件,然后写入redhat
在这里插入图片描述
w是没有读的权限的:不能使用变量.read()来在python中直接获取文件内容。
而w+拥有读和写的权限。

在这里插入图片描述

在这里插入图片描述
这里我们使用了f.seek()使指针到达文本的0位置,来使其向后读取文件内容。在后续会讲到seek方法。


对文件的使用:rb:打开二进制文件:使输出集中在一行:

在这里插入图片描述
这种方法将所有内容读取到一行,\n直接打印输出,而不执行。和readlines()方法相同
readline() 每次读取一行 ##逐行读取,指定参数使其读取指定数量的字符
readlines() 返回列表,其元素为每一行的内容

在这里插入图片描述
当直接readline(参数)的效果和read(参数)效果相同,都为直接输出指定数量的字符
在这里插入图片描述
上述的\n,我们可以使用strip()方法去除所有类型空格来去除:

f = open('/tmp/passwd','rb')
print([line.strip() for line in f.readlines()])  #列表生成式来生成去除空格的文本内容
f.close()             #关闭文件

在这里插入图片描述
可以使用map内置函数,替换上一行代码:

print(list(map(lambda x:x.strip(),f.readlines())))

seek方法:移动指针位置:

1.seek第一个参数是偏移量:>0,代表向右移动,<0,代表向左移动
2.seek第二个参数是:
【 0:从文件开头开始移动】
【1:从当前位置开始移动】
【2:从文件末尾开始移动】
3.可以单独使用一个参数,默认是从头开始,向右移动指定位置。

注意:系统默认使用的模式只支持正向移动,不支持反向移动,也不支持第二个参数的1和2.需要改为b模式。

例如:f = open('/tmp/passwd','rb') #在b模式

非纯文本文件读写:

rb、rb+、wb、wb+、ab、ab+

图片:
f = open('redhat.jpg',mode='rb')  #读模式
content = f.read()   #读,但是图片读了是看不到的
f.close()

f1 = open('hello.jpg',mode='wb')   #新建hello.jpg来打开查看原图
f1.write(content)   #将刚才读到的图片内容content写到helo.jpg中
f1.close()
#之后可以在主机图形界面查看到hello.jpg这个图片

with方式读取文件:

省略关闭对象的步骤。

示例一:
with open('/tmp/passwd') as f:   #with方式替换
    print(f.read())    #打印读取的内容

示例二:
with open('/tmp/passwd') as f1,\
    open('/tmp/passwd1','w+') as f2:  #创建passwd1作为f2
    f2.write(f1.read()) #f2中写入f1的内容
    f2.seek(0,0)  #调整指针位置
    print(f2.read())  #打印f2

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值