python3之IO与序列化

文件IO

读写txt文件

with open("../files/test.txt", encoding="utf-8-sig") as f:
    str = f.read()
    lst = []
    if str:
        data = str.split("\n")
        for row in data:
            if len(row) > 0:
                lst.append(row.split(","))
print(lst)


with open("../files/test.txt", "w", encoding="utf-8-sig") as f:
    str = ""
    for row in lst:
        str += ",".join(row) + "\n"
    if len(str) > 0:
        f.write(str)

读写csv

import csv, random

data = []
with open("../files/pd.csv", encoding="utf-8-sig") as f:
    reader = csv.reader(f, skipinitialspace=True)
    headers = next(reader)
    for row in reader:
        data.append(row)
print(headers, data)


with open("../files/pd.csv", "w", newline="\n") as f:
    writer = csv.writer(f)
    data.append(
        [
            len(data),
            random.randint(5, 10),
            random.randint(2, 8),
            random.randint(6, 15),
            random.randint(1, 20),
        ]
    )
    writer.writerows([headers])
    writer.writerows(data)
    f.close()

内存IO

from io import StringIO, BytesIO

# 内存中读写文本
f = StringIO()
f.write("你")
f.write("好")
print(f.getvalue())  # 你好

f.writelines("\nhello\nhi")
print(f.getvalue())

f = StringIO("你好")
print("第一次读", f.read())  # 第一次读 你好
print("第二次读", f.read())  # 第二次读
print("getvalue", f.getvalue())  # getvalue 你好

while True:
    text = f.readline()
    if text == "":
        break
    print(text.strip())

print(f.readlines())  # []

# 内存中读写二进制
f = BytesIO()
f.write(b"a")
f.write("你好".encode("utf-8"))
print(f.getvalue())  # b'a\xe4\xbd\xa0\xe5\xa5\xbd'
print(f.getvalue().decode("utf-8"))  # a你好

f = BytesIO(b"a\xe4\xbd\xa0\xe5\xa5\xbd")
text = f.read()
print(text)  # b'a\xe4\xbd\xa0\xe5\xa5\xbd'
print(text.decode("utf-8"))  # a你好

序列化

pickle序列化

import pickle


obj = [[1], 123, 0.1, "a", "中文", {"k2": (1, 2), "k1": [1, 2], "k3": {"a": 1}}]
print(obj)  # [[1], 123, 0.1, 'a', '中文', {'k2': (1, 2), 'k1': [1, 2], 'k3': {'a': 1}}]

# pickle
str = pickle.dumps(obj)
print(str)  # b'\x80\x04\x95<\x00\x00\x00\x00\x00\x00\x00]\x94(]\x94(K\x01K\x02eK'...
print(pickle.loads(str))  # [[1], 123, 0.1, 'a', '中文', {'k2': (1, 2), 'k1': [1, 2], 'k3': {'a': 1}}]

with open("../files/pickle.txt", "wb") as fp:
    pickle.dump(str, fp)

with open("../files/pickle.txt", "rb") as fp:
    data = pickle.load(fp)
    print(data)  # b'\x80\x04\x95<\x00\x00\x00\x00\x00\x00\x00]\x94(]\x94(K\x01K\x02eK'...
    print(pickle.loads(data))  # [[1], 123, 0.1, 'a', '中文', {'k2': (1, 2), 'k1': [1, 2], 'k3': {'a': 1}}]

json序列化

import json


obj = [[1], 123, 0.1, "a", "中文", {"k2": (1, 2), "k1": [1, 2], "k3": {"a": 1}}]
print(obj)  # [[1], 123, 0.1, 'a', '中文', {'k2': (1, 2), 'k1': [1, 2], 'k3': {'a': 1}}]

# json
# 编码 转化成str格式
str = json.dumps(obj)
print(str)  # [[1], 123, 0.1, "a", "\u4e2d\u6587", {"k2": [1, 2], "k1": [1, 2], "k3": {"a": 1}}]
print(type(str))  # <class 'str'>
str = json.dumps(obj, sort_keys=True)  # 对dict对象进行排序
print(str)  # [[1], 123, 0.1, "a", "\u4e2d\u6587", {"k1": [1, 2], "k2": [1, 2], "k3": {"a": 1}}]
str = json.dumps(obj, indent=4)  # 缩进,便于阅读
print(str)
# 解码 将str转化成dict/list格式
json1 = json.loads(str)
print(json1)  # [[1], 123, 0.1, 'a', '中文', {'k2': [1, 2], 'k1': [1, 2], 'k3': {'a': 1}}]


with open("../files/test.json", encoding="utf-8-sig") as fp:
    data = json.load(fp)
    print(data)  # {'name': '一', 'age': 5, 'area': 'a'}

with open("../files/test.json", "w+", encoding="utf-8-sig") as fp:
    if len(data) > 0 and "data" in data and "name" in data["data"]:
        data["data"]["name"] = "二"
        json.dump(data, fp)

 

posted @ 2024-01-10 16:43  carol2014  阅读(5)  评论(0编辑  收藏  举报