[阶段一] 13. Python文件操作

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('你好,小白')
  • 序列化与反序列化:

序列化就是将对象信息或数据结构信息按一定规则转换,达到文件存储或网络传输的效果。

有序列化,肯定也有反序列化。把数据结构或对象转换为字节序列的过程称为序列化,把字节序列恢复为数据结合或对象的过程称为反序列化。

可序列化的数据类型:numberstrlisttupledict,其中 dict 是最常见的序列化类型。类、函数、集合不能进行序列化。

在 python 中,有专门处理 json 格式的模块:jsonpicle 模块。不同的是 json 模块序列化出来的是通用格式,其它编程语言都认识,就是普通的字符串;而 picle 模块序列化出来的只有 python 可以识别,其他编程语言无法识别,表现为乱码。

jsonpickle 模块都提供了 dumpsloads方法。对于 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))

Guess you like

Origin blog.csdn.net/miss1181248983/article/details/120294006