第7章 文件读取操作

7.5 用python操作文件的3种模式

在这里插入图片描述
读的模式打开只能读,写模式打开只能写。
类似于word的只读模式
所以python打开文件得🔝文件

文件打开模式(文本模式)
在这里插入图片描述

[DEV (v.v) sa_cluster@hybrid01 ~]$ cat test.py 
f = open("name_list",mode="w")

f.write("张三")
f.write("李四")

f.close()[DEV (v.v) sa_cluster@hybrid01 ~]$ cat name_list 
张三李四[DEV (v.v) sa_cluster@hybrid01 ~]$ 
[DEV (v.v) sa_cluster@hybrid01 ~]$ 

##文件已经存在就会覆盖
[DEV (v.v) sa_cluster@hybrid01 ~]$ python3 test.py 
[DEV (v.v) sa_cluster@hybrid01 ~]$ cat name_list 
张三
李四
[DEV (v.v) sa_cluster@hybrid01 ~]$ 
[DEV (v.v) sa_cluster@hybrid01 ~]$  cat test.py 
f = open("name_list",mode="w")

f.write("张三\n")
f.write("李四\n")

## 文件只能写不能读,所以读会报错
DEV (v.v) sa_cluster@hybrid01 ~]$  cat test.py 
f = open("name_list",mode="w")

f.write("张三\n")
f.write("李四\n")
f.read()         ##添加了这行
f.close()

[DEV (v.v) sa_cluster@hybrid01 ~]$ python3 test.py 
Traceback (most recent call last):
  File "/home/sa_cluster/test.py", line 5, in <module>
    f.read()
io.UnsupportedOperation: not readable


####同理,读模式不能写
[DEV (v.v) sa_cluster@hybrid01 ~]$ python3 test.py 
Traceback (most recent call last):
  File "/home/sa_cluster/test.py", line 3, in <module>
    f.write("张三\n")
io.UnsupportedOperation: not writable
[DEV (v.v) sa_cluster@hybrid01 ~]$ 
[DEV (v.v) sa_cluster@hybrid01 ~]$  cat test.py 
f = open("name_list",mode="r")

f.write("张三\n")
f.write("李四\n")
f.read()
f.close()[DEV (v.v) sa_cluster@hybrid01 ~]$ 


## 正常读,打印
DEV (v.v) sa_cluster@hybrid01 ~]$ python3 test.py 
张三
李四

[DEV (v.v) sa_cluster@hybrid01 ~]$ 
[DEV (v.v) sa_cluster@hybrid01 ~]$ cat test.py 
f = open("name_list",mode="r")

# f.write("张三\n")
# f.write("李四\n")
print(f.read())
f.close()[DEV (v.v) sa_cluster@hybrid01 ~]$ 



## 只想读部分
比如只想读第一行

[DEV (v.v) sa_cluster@hybrid01 ~]$ cat test.py 
f = open("name_list",mode="r")

# f.write("张三\n")
# f.write("李四\n")
print(f.read())
print('-------------')
print(f.readline())      ##光标已经到最后一行了,所以这里为空行
[DEV (v.v) sa_cluster@hybrid01 ~]$ python3 test.py 
张三
李四

-------------

[DEV (v.v) sa_cluster@hybrid01 ~]$ cat test.py 
f = open("name_list",mode="r")


print(f.readline())
print('-------------')
print(f.read())


[DEV (v.v) sa_cluster@hybrid01 ~]$ python3 test.py 
张三
                           ##这一行是因为readline自己带了换行符,然后print打印出来了
-------------
李四

追加模式
在这里插入图片描述
追加的时候也是只能写,不能读,读会报错
追加就是写日志的时候比较适合使用。

7.6 遍历文件

DEV (v.v) sa_cluster@hybrid01 ~]$ cat name_list 
张三  深圳  173  48        ##其实每一行最后都有一个\n
李四  北京  182  32
王武  南京  178  64
收到  上海  163  50
发到  西安  183  32
地方  湖北  123  77
如果  宁夏  170  65[DEV (v.v) sa_cluster@hybrid01 ~]$ 
[DEV (v.v) sa_cluster@hybrid01 ~]$ 
[DEV (v.v) sa_cluster@hybrid01 ~]$ python3 test.py 
张三  深圳  173  48 

李四  北京  182  32

王武  南京  178  64

收到  上海  163  50

发到  西安  183  32

地方  湖北  123  77

如果  宁夏  170  65
[DEV (v.v) sa_cluster@hybrid01 ~]$ 
[DEV (v.v) sa_cluster@hybrid01 ~]$ cat test.py 
f = open('name_list')
for lie in f:
    print(lie)         



[DEV (v.v) sa_cluster@hybrid01 ~]$ python3 test.py 
['张三  深圳  173  48 \n', '李四  北京  182  32\n', '王武  南京  178  64\n', '收到  上海  163  50\n', '发到  西安  183  32\n', '地方  湖北  123  77\n', '如果  宁夏  170  65']
[DEV (v.v) sa_cluster@hybrid01 ~]$ 
[DEV (v.v) sa_cluster@hybrid01 ~]$ cat test.py 
f = open('name_list')
print(f.readlines())
# for lie in f:
#     print(lie)
    [DEV (v.v) sa_cluster@hybrid01 ~]$ 




分成列表

[DEV (v.v) sa_cluster@hybrid01 ~]$ cat test.py 
f = open('name_list')
for lie in f:
    lie = lie.split()
    print(lie)
    [DEV (v.v) sa_cluster@hybrid01 ~]$ python3 test.py 
['张三', '深圳', '173', '48']
['李四', '北京', '182', '32']
['王武', '南京', '178', '64']
['收到', '上海', '163', '50']
['发到', '西安', '183', '32']
['地方', '湖北', '123', '77']
['如果', '宁夏', '170', '65']

###拿三四列
DEV (v.v) sa_cluster@hybrid01 ~]$ cat test.py 
f = open('name_list')
for lie in f:
    lie = lie.split()
    # print(lie)
    heigt = lie[2]
    weight= lie[3]
    if int(heigt) >= 170 and int(weight) <= 50:
        print(lie)
    [DEV (v.v) sa_cluster@hybrid01 ~]$ 
[DEV (v.v) sa_cluster@hybrid01 ~]$ 
[DEV (v.v) sa_cluster@hybrid01 ~]$ python3 test.py 
['张三', '深圳', '173', '48']
['李四', '北京', '182', '32']
['发到', '西安', '183', '32']

##如果需要打开图片
在这里插入图片描述
直接执行报错
在这里插入图片描述
None代表空的
比如name最开始没有值,后面会赋值
所以可以两种方法,建议2
(1)name = “”
(2)name = None ##空值

encoding==None 告诉解释器这个文件是什么编码的,None表示使用默认编码。默认是utf8
但是图片没办法指定编码格式
测试,修改文件为gbk模式的文件
在这里插入图片描述
尝试打开文件
在这里插入图片描述
所以需要指定告诉解释器用gbk读
在这里插入图片描述
问题来了 jpg 不是文本格式,不能指定encoding。那如何读呢?

以二进制模式(01010)打开:所有底层都是二进制。
在这里插入图片描述
在这里插入图片描述
这就是字节类型了。。图片的二进制内容

二进制写
把内容变成gbk格式的
在这里插入图片描述
在这里插入图片描述
二进制格式写的格式是gbk 但是解释器默认是utf8解释
所以乱码。但是读进来没问题

修改为utf-8编码的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.8 调到文件任意位置修改

在这里插入图片描述

在这里插入图片描述
给覆盖了一部分

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
作用:回到某个位置覆盖修改的

在这里插入图片描述
cpu 内存 硬盘
内存开了一块区域叫缓存
你write的时候会写到缓存上。
达到一定数量会刷到硬盘上,(缓存也是内存,断电丢失数据)所以flush就是强制刷到硬盘上。

在这里插入图片描述
后面俩还在内存里,但是前面俩已经刷到硬盘了
在这里插入图片描述

混合模式

打开文件可以读,可以写
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
相当于r的光标在52 w的光标在最后
在这里插入图片描述
会追加到文件尾部

在这里插入图片描述
在这里插入图片描述
相当于r的光标在52 w的光标挪动到52 然后覆盖写

7.10 文件修改

前面的覆盖写很鸡肋
文件修改不覆盖而是往后挤
1、打开文件,把内容都加载到内存
写完后重新写到硬盘中

在这里插入图片描述
在这里插入图片描述
f.truncate()从光标位置往后的全部清空
f.truncate(100) 从光标位置往后截取100个字节
在这里插入图片描述
如果文件特别大,这样就很鸡肋

开发全局文本检索替换

在这里插入图片描述
在这里插入图片描述
python传参
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值