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传参