iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >面试宝典_Python.运维开发.000
  • 697
分享到

面试宝典_Python.运维开发.000

宝典_Python 2023-01-31 06:01:45 697人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

面试题目:1. 用python实现tail -f功能,默认显示最后15行,实时输出新增行?解题思路:1. 此需求在很多场景中都有遇到,而且在各大群中也被讨论过,虽然有现成的模版如pyinotify等模块实现,但面试更想通过你的解题思路来判断

面试题目:

1. 用python实现tail -f功能,默认显示最后15行,实时输出新增行?


解题思路:

1. 此需求在很多场景中都有遇到,而且在各大群中也被讨论过,虽然有现成的模版如pyinotify等模块实现,但面试更想通过你的解题思路来判断这场面试,具体到tail需要实现2个功能,一个实时输出新增内容,一个默认输出前15行,前者直接循环打开文件读取,全局变量中记录上次读取的位置,下一次循环seek到上次的位置读取即可,而对于默认显示前15行的做法是假设一行1000个字节,循环读取,当文件总长度小于1000时则从开头开始读取分割行取出后10行即可,即使不够10行也没关系,当文件总长度大于等于1000时,如果分割后大于10行,则读取分割行取出后10行即可,如果小于10行则继续向前1000个读取,以此类推~


具体实现:

#!/usr/bin/env Python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# 51CTOBG: Http://xmdevops.blog.51cto.com/
# Purpose:
#
"""
from __future__ import absolute_import
# 说明: 导入公共模块
import os 
import sys
import time
import chardet
# 说明: 导入其它模块
# 


if __name__ == '__main__':
    seekps = 0;
    target = 'data.txt';

    try:
        # 指针跳到最后作为起读位置
        with open(target, 'r+b') as f:
            f.seek(0, os.SEEK_END)
            seekps = f.tell()
            print 'notice: file length is', seekps
            rest_lines = []
            # 默认读取15行
            line_reads = 15
            # 假设默认每行1000字节
            line_bytes = 1000
            '''
            1. 当f_length < line_bytes,就seek到0开始读取,读完break
            2. 当f_length > line_bytes,换行符数n表示n+1行
               => 当n+1 >= line_reads,取出其中前line_reads个元素
               => 当n+1 <  line_reads,继续向前seek到count*line_reads位置读取
            '''
            count = 1
            while True:
                if seekps <= line_bytes*count:
                    f.seek(0)
                    rest_lines = f.read().split(os.linesep)[-line_reads:]
                    break
                f.seek(-1*line_bytes*count, 2)
                rest_lines = f.read().split(os.linesep)
                if len(rest_lines)>=line_reads:
                    rest_lines = rest_lines[-line_reads:]
                    break
                else:
                    count += 1

            for line in rest_lines:
                code = chardet.detect(line).get('encoding')
                line = line.decode(code).encode(sys.stdout.encoding)
                sys.stdout.write(''.join([line.strip(), os.linesep]))
                sys.stdout.flush()

    except Exception, e:
        print 'notice: open file with error({0})'.fORMat(e)
        exit()

    print 'notice: start position is', seekps
    while True:
        try:
            with open(target, 'r+b') as f:
                f.seek(0, os.SEEK_END)
                # 防止数据被意外截断
                if f.tell()<seekps:
                    f.seek(f.tell())
                else:
                    f.seek(seekps)

                while True:
                    line = f.readline()
                    if not line.strip():
                        break
                    code = chardet.detect(line).get('encoding')
                    line = line.decode(code).encode(sys.stdout.encoding)
                    sys.stdout.write(''.join([line.strip(), os.linesep]))
                    sys.stdout.flush()
                seekps = f.tell()
        except Exception, e:
            print 'notice: open file with error({0})'.format(e)
            break
        time.sleep(0.1)


有图有像:

wKioL1iXNFngMPcWAABFkWpclw8083.png

--结束END--

本文标题: 面试宝典_Python.运维开发.000

本文链接: https://www.lsjlt.com/news/190618.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 面试宝典_Python.运维开发.000
    面试题目:1. 用PYTHON实现tail -f功能,默认显示最后15行,实时输出新增行解题思路:1. 此需求在很多场景中都有遇到,而且在各大群中也被讨论过,虽然有现成的模版如pyinotify等模块实现,但面试更想通过你的解题思路来判断这...
    99+
    2023-01-31
    宝典 _Python
  • 面试宝典_Python.常规算法.000
    面试题目:1. 用PYTHON实现一个扁平化的字典,如{'a': {'b': '1'}}扁平化处理后变成{'a.b': 1}解题思路:1. 由于字典可能是无限嵌套的,所以第一印象就想到采用递归函数完成,由于扁平化数据需要零时存储以及永久存储...
    99+
    2023-01-31
    算法 常规 宝典
  • Go开发技术面试宝典:如何处理并发问题?
    Go语言是一种支持并发编程的语言,同时也是一个广泛应用于网络编程和云计算领域的编程语言。在Go语言中,处理并发问题是非常重要的一个技能。在这篇文章中,我们将会介绍一些处理并发问题的技巧和方法,帮助您在Go开发面试中更加从容应对。 一、Go语...
    99+
    2023-06-28
    开发技术 面试 并发
  • PHP面试宝典之高并发、负载均衡
    什么是高并发、高性能、高可用? 高并发:系统能够同时并行处理很多请求(同一时间内大量的网络请求),指标:响应时间,吞吐量,每秒查询率,并发用户数 高性能:程序处理速度快,所占内存少、cpu占用率低。 ...
    99+
    2023-09-10
    php 面试 负载均衡
  • 二维码面试题:Java开发者需要掌握哪些技能?
    随着智能手机的普及,二维码技术越来越受到关注。二维码作为一种可读性高、存储信息量大、易于制作和传播的技术,已经被广泛应用于支付、物流、门禁等领域。作为一名Java开发者,如果你想在二维码应用开发领域获得成功,那么你需要掌握以下技能: 一、...
    99+
    2023-10-20
    教程 二维码 面试
  • 高级开发运维测试必须掌握的envsubst命令使用详解
    目录0 | 是什么1 | 怎么用2 | 举例说明0 | 是什么 envsubst 缩写来自于 environment variable substitution,即环境变量替换,是一个用于替换 shell 环境变量的工...
    99+
    2023-04-13
    开发运维测试envsubst命令 envsubst命令
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作