INPUT


try:
    # 额外参数,如:open('./2.html', 'r', encoding='gbk', errors='ignore')
    f = open('./2.html')
    # 一次读取全部,文件超过内存大小就不行
    print(f.read())

    # 根据size读取
    while (True):
        res = f.read(1024)
        if (res):
            print(res)
        else:
            break

    # 一次读取一行
    line = f.readline()

    # 一次读取,按行分配到list
    f.readlines()

finally:
    if f:
        f.close()

with写法,会自动 close

with open('./2.html') as f:
    print(f.read())

自定义类使用 with 关键字

class MyOpen(object):

    def __enter__(self):
        print('进入')
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出')

    def read(self):
        print('读取')


with MyOpen() as o:
    o.read()

使用上下问管理器

from contextlib import contextmanager


class Test(object):
    def run(self):
        print('run test')


@contextmanager
def create_test():
    print('begin')
    t = Test()
    yield t
    print('end')


with create_test() as t:
    t.run()

with也可以使用在函数上

from contextlib import contextmanager
from datetime import datetime
import time

@contextmanager
def test():
    beginTime = datetime.now().timestamp()
    yield
    endTime = datetime.now().timestamp()
    print(endTime - beginTime)

# 输出如下代码的执行时间(下面2行代码会在yield的地方执行)
with test():
    time.sleep(3)
    print('run')

OUTPUT

with open("./1.txt", "w") as f:
    f.write('test')

StringIO BytesIO

很多时候,数据读写不一定是文件,也可以在内存中读写

from io import StringIO
from io import BytesIO

f1 = StringIO();
f2 = BytesIO();

os shutil 模块

import os
import shutil

# 操作系统类型
print(os.name)

# 操作系统详细信息
print(os.uname())

# 环境变量
print(os.environ)

# 查看当前目录的绝对路径
print(os.path.abspath('.'))

# 生成目录
print(os.path.join('/Users/tangxiaofeng/wwwroot/python', 'testDir'))

# 拆分目录
print(os.path.split('/Users/tangxiaofeng/wwwroot/python/testDir'))

# 拆分目录,得到扩展名
print(os.path.splitext(('/Users/tangxiaofeng/wwwroot/python/1.csv')))

# 创建目录
os.mkdir(os.path.join('/Users/tangxiaofeng/wwwroot/python', 'testDir'))

# 删除目录
os.rmdir(os.path.join('/Users/tangxiaofeng/wwwroot/python', 'testDir'))

# 重命名文件
print(os.rename('1.txt', '1.py'))

# 删除文件
print(os.remove('1.py'))

# 复制文件
print(shutil.copyfile("1.csv","2.csv"))

序列化

import pickle

d = dict(name='Bob',age=20)

# 序列化
s = pickle.dumps(d)
print(s)
# 反序列化
print(pickle.loads(s))

# 直接序列化写入到文件
f = open('dump.txt','wb')
pickle.dump(d,f)
f.close()

# 从文件中反序列化
f = open("dump.txt",'rb')
d = pickle.load(f)
f.close()
print(d)

JSON序列化

Python的序列化和反序列化只能用于Python,并且可能不同版本的Python彼此都不兼容,所以JSON是更好的选择


import json

# JSON序列化和反序列化
d = dict(name='张三', age=13)
jd = json.dumps(d)
d = json.loads(jd)
print(jd)
print(d)

# 直接序列化写入到文件
f = open('dump.txt', 'w')
json.dump(d, f)
f.close()
f = open('dump.txt', 'r')
print(json.load(f))

对象和JSON互转

import json


class Student(object):
    name = ''
    age = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age


s = Student('张三', 13)


def studentToDict(obj):
    return dict(name=obj.name, age=obj.age)


js = json.dumps(s, default=studentToDict)
print(js)

# 上面方法的偷懒写法
js = json.dumps(s, default=lambda obj: obj.__dict__)
print(js)


def dictToStudent(d):
    return Student(d['name'], d['age'])


s = json.loads(js, object_hook=dictToStudent)
print(s.name, s.age)

results matching ""

    No results matching ""