python文件操作
open
函数:
open
函数的功能是生成文件对象,进行创建、读写操作。
用法:
open(path, mode)
参数 path
表示文件路径,mode
表示操作模式,返回一个文件对象。
- 文件操作模式:
mode | 说明 | 注意 |
---|---|---|
r | 只读方式打开 | 文件必须存在 |
w | 只写方式打开 | 文件不存在则创建文件;文件存在则清空文件内容 |
a | 追加方式打开 | 文件不存在则创建文件 |
r+ w+ | 读写方式打开 | w+ 文件不存在则创建文件;文件存在则清空文件内容 |
a+ | 追加和读写方式打开 | |
rb wb ab rb+ wb+ ab+ | 二进制方式打开 |
- 文件对象的操作方法:
方法名 | 参数 | 介绍 | 示例 |
---|---|---|---|
read | 无 | 返回整个文件字符串 | f.read() |
readline | 无 | 逐行返回文件中的一行 | f.readline() |
readlines | 无 | 返回文件列表 | f.readlines() |
mode(属性) | 无 | 文件模式 | f.mode |
name(属性) | 无 | 返回文件名称 | f.name |
write | message | 写入信息 | f.write(‘hello\n’) |
writelines | message | 批量写入信息 | f.writelines([‘hello\n’, ‘world\n’]) |
close | 无 | 关闭并保存文件 | f.close() |
closed(属性) | 无 | 文件是否关闭,返回 bool 类型 | f.closed |
对一个文件对象完成操作后,必须使用 close
方法,否则操作不会保存,且内存会一直占用甚至内存溢出。
示例:
# coding:utf-8
import os
class Open(object):
def __init__(self, path, mode='r+', is_return=True):
self.path = path
self.mode = mode
self.is_return = is_return
def read(self, is_strip=True):
result = []
with open(self.path, mode=self.mode, encoding='utf-8') as f:
data = f.readlines()
for line in data:
if is_strip:
temp = line.strip()
if temp != '':
result.append(temp)
else:
if line != '':
result.append(line)
return result
def write(self, message):
try:
f = open(self.path, mode=self.mode, encoding='utf-8')
if self.is_return:
if message.endswith('\n') is False:
message = '%s\n' % message
else:
message = message.replace('\n', '')
message = '%s\n' % message
f.write(message)
except Exception as e:
return e
finally:
f.close()
if __name__ == '__main__':
current_path = os.getcwd()
open_path = os.path.join(current_path, 'b.txt')
o = Open(open_path)
data = o.read()
print(data)
# o.write('你好,小白')
- 序列化与反序列化:
序列化就是将对象信息或数据结构信息按一定规则转换,达到文件存储或网络传输的效果。
有序列化,肯定也有反序列化。把数据结构或对象转换为字节序列的过程称为序列化,把字节序列恢复为数据结合或对象的过程称为反序列化。
可序列化的数据类型:number
、str
、list
、tuple
、dict
,其中 dict
是最常见的序列化类型。类、函数、集合不能进行序列化。
在 python 中,有专门处理 json 格式的模块:json
和 picle
模块。不同的是 json
模块序列化出来的是通用格式,其它编程语言都认识,就是普通的字符串;而 picle
模块序列化出来的只有 python 可以识别,其他编程语言无法识别,表现为乱码。
json
和 pickle
模块都提供了 dumps
和 loads
方法。对于 json
模块,
方法名 | 参数 | 介绍 | 示例 | 返回值 |
---|---|---|---|---|
dumps | obj | 对象序列化 | json.dumps([1, 2]) | 字符串 |
loads | str | 反序列化 | json.loads(’[1, 2, 3]’) | 原始数据类型 |
对于 pickle
模块,
方法名 | 参数 | 介绍 | 示例 | 返回值 |
---|---|---|---|---|
dumps | obj | 对象序列化 | pickle.dumps([1, 2]) | 比特 |
loads | byte | 反序列化 | pickle.loads(’[1, 2, 3]’) | 原始数据类型 |
示例:
# coding:utf-8
import json
class Json(object):
def __init__(self, path, mode, data):
self.path = path
self.mode = mode
self.data = data
def read(self):
with open(self.path, self.mode) as f:
self.data = f.read()
return json.loads(self.data)
def write(self):
with open(self.path, self.mode) as f:
if isinstance(self.data, dict):
_data = json.dumps(self.data)
f.write(_data)
else:
raise TypeError('data is dict')
return True
if __name__ == '__main__':
data = {'name': '小白', 'age': 18, 'height': 175}
j = Json('test.json', 'r+', data)
j.write()
result = j.read()
print(result, type(result))
- yaml 文件的读取:
yaml 文件通常用于一些定义好不常修改的内容,如服务配置文件。yaml 文件内容的上一级与下一级之间是 2 个空格。示例:
apiVersion: v1
kind: Service
metadata:
name: default-http-backend
namespace: ingress-nginx
labels:
app.kubernetes.io/name: default-http-backend
app.kubernetes.io/part-of: ingress-nginx
spec:
ports:
- port: 80
targetPort: 8080
selector:
app.kubernetes.io/name: default-http-backend
app.kubernetes.io/part-of: ingress-nginx
安装 yaml 模块:pip install PyYaml
。yaml 文件在读取后得到的是 dict
类型的数据,读取 yaml 文件的方法:
import yaml
f = open(yaml_file, 'r')
data = yaml.load(f.read(), Loader=yaml.FullLoader)
f.close()
示例:
# coding:utf-8
import yaml
class Yaml(object):
def __init__(self, path, mode):
self.path = path
self.mode = mode
def read(self):
with open(self.path, self.mode) as f:
data = f.read()
return yaml.load(data, Loader=yaml.FullLoader)
if __name__ == '__main__':
y = Yaml('test.yaml', 'r')
result = y.read()
print(result, '\n', type(result))