Python3文件对象操作
Python3文件对象操作
夏洛特_ 发表于1年前
Python3文件对象操作
  • 发表于 1年前
  • 阅读 7
  • 收藏 1
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

1.实现os.walk方法(广度优先)

import os
def walk(root):
    stack = [root]
    files = []
    while stack:
        cur = stack.pop()
        for x in os.scandir(cur):
            if x.is_dir():
                stack.append(x.path)
            else:
                files.append(x.path)
    return files

2.实现一个优先队列,由用户指定比较函数

from collections import namedtuple


ProporityQueue = namedtuple('ProporityQueue', ['add', 'pop'])

def priority_queue_factory(cmp=None):
    def default_cmp(a, b):
        if a > b:
            return 1
        if a == b:
            return 0
        return -1
    if cmp is None:
        cmp = default_cmp
    
    data = []
    def add(e):
        idx = len(data)
        data.append(e)
        parent_idx = (idx - 1) // 2
        while parent_idx >= 0:
            #if data[idx] > data[parent_idx]:
            if cmp(data[idx], data[parent_idx]) > 0:
                data[parent_idx], data[idx] = data[idx], data[parent_idx]
                idx = parent_idx
                parent_idx = (idx - 1) // 2
            else:
                break
    
    def pop():
        if not data:
            return None
        if len(data) == 1:
            return data.pop()
        idx = 0
        ret = data[idx]
        data[idx] = data.pop()
        left_idx = 2 * idx + 1
        rigth_idx = left_idx + 1
        while left_idx < len(data):
            child_idx = left_idx
            #if rigth_idx < len(data) and data[rigth_idx] > data[left_idx]: # 存在右子节点 并且 右子节点大于左子节点
            if rigth_idx < len(data) and cmp(data[rigth_idx], data[left_idx]) > 0:
                child_idx = rigth_idx
            #if data[idx] < data[child_idx]:
            if cmp(data[idx], data[child_idx]) < 0:
                data[idx], data[child_idx] = data[child_idx], data[idx]
                idx = child_idx
                left_idx = 2 * idx + 1
                rigth_idx = left_idx + 1
            else:
                break
        return ret
    
    return ProporityQueue(add, pop)

3.实现tail -f的功能

import time
import threading

def tailf(path):
    offset = 0
    event = threading.Event()
    try:
        while not event.is_set():
            with open(path) as f:
                if offset > os.stat(path).st_size:
                #if offset > len(f)
                    offset = 0
                f.seek(offset)
    #             for line in f:
    #                 yield line
                yield from f
                offset = f.tell()
            event.wait(0.1)
    except KeyboardInterrupt:
        event.set()
        
for x in tailf('utf8.txt'):
    print(x,)

 

共有 人打赏支持
粉丝 2
博文 79
码字总数 70704
×
夏洛特_
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: