如何从一个1G的文件中找到你所需要的东西

本文介绍了一种使用Python高效筛选大文件特定时间段日志的方法。通过移动文件指针定位开始与结束时间戳,实现对指定时间范围内日志的快速读取。此方法适用于处理较大规模的日志文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何从一个1G的文件中找到你所需要的东西,这个问题貌似面试的时候会经常问到。不过不论你用什么语言,肯定逃脱不了按指针读或者按块读。

这里介绍python的用法。本人亲自实验了,速度还可以。

如果你的文件还不是很大,那么最好的方式:

with open('log2.txt') as f:
    for line in f:
        print line.strip()

貌似这种方式是最快的,不过如果再大点的话,还是比较耗时

这里有个日志文件,请看格式:

现在我们想把开始时间为2015-07-18-18:58:00到2015-07-18-18:58:01这段时间的日志快速的筛选出来。

其实你只要理解文件指针的移动就很会很快有思路。

fp = open('log.txt')

fp.tell()文件指针的位置

fp.seek(0,os.SEEK_END) 文件结尾

fp.seek(0,os.SEEK_SET) 定位到文件开头

fp.seek(123,os.SEEK_SET) 定位到指针123的位置

fp.seek(0,os.SEEK_CUR) 当前指针的位置

下面是源代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Eric.yue

import os,time

def find_start_time(start_time,f,size):
    start_point = -1
    seek_point = f.tell()
    #找到开始位置的指针
    while seek_point < size:
         line = f.readline()
         if line.startswith(start_time):
            start_point = seek_point
            break
         seek_point = f.tell()
    return start_point

def find_end_time(end_time,f, size):
    end_point = -1
    seek_point = f.tell()

    while seek_point < size:
        line = f.readline()
        if line.startswith(end_time):
            end_point = seek_point
            print 'first end line pos:%s' % line
            break
        #指针移动一定要加上不然会出现死循环
        seek_point = f.tell()

    #继续移动指针找到最后一次出现的时间位置
    while seek_point < size:
        line = f.readline()
        if not line.startswith(end_time):
            end_point = seek_point
            print 'last end line pos:%s' % line
            break
        seek_point = f.tell()

    return end_point

def read_file(start_point,end_point,fp):
    fp.seek(start_point, os.SEEK_SET)
    while fp.tell() < end_point:
        print fp.readline()

if __name__ == '__main__':
    fp = open('./log','r')
    fp.seek(0,os.SEEK_END)
    #获取文件最后的位置
    size = fp.tell()
    #重新定位到开头
    fp.seek(0, os.SEEK_SET)

    s_time = time.time()
    #查找开始时间的位置
    s_point = find_start_time('2015-07-18-18:58:00',fp,size)
    #查找结束时间的位置
    e_point = find_end_time('2015-07-18-18:58:01', fp, size)
    #打印开始时间和结束时间的数据
    read_file(s_point,e_point,fp)
    
    e_time = time.time()
    print 'spend time %s' % (e_time - s_time)
    fp.close()

OVER!

 

转载于:https://www.cnblogs.com/gide/p/8575403.html

<think>嗯,用户需要查找已安装软件的具体置。结合之前的引用,用户提到Linux系统通常安装到/usr/share和/usr/local目录,但软件可能不总是安装到默认目录。用户现在的问题是基于Linux环境来找软件安装路径。用户可能不太熟悉命令行操作,需要简单明确的方法。首先想到用which或whereis命令查找可执行文件路径,这通常能定到主程序置。比如输入whichfirefox就能知道Firefox的安装路径。但需要注意,这只是可执行文件置,实际安装目录可能在上级路径。如果软件是通过包管理器安装的,dpkg-L或rpm-q命令可以列出所有安装文件路径。比如在Ubuntu上用dpkg-Lvim会显示所有相关文件。但类似编译安装或手动解压的软件,包管理器就查不到了。对于这类手动安装的软件,可能需要查看进程信息。比如运行软件后用psaux|grep软件名,或者更精准的pwdx命令结合进程ID。当软件运行时,/proc目录下的进程信息会包含cwd(当前工作目录)和exe(执行文件)的符号链接。这样能直接看到安装路径的绝对置。用户提供的引用中提到有时安装会被卡住,但用户当前需求是查找已安装的软件置,所以进程方法主要是针对正在运行的软件。如果软件没在运行,可能需要结合其他方法比如查看环境变量PATH或者手动搜索常见安装目录如/opt或用户主目录。最后还得提醒用户注意权限问题,有些目录需要sudo才能访问。同时不同安装方式会导致路径差异,比如Snap或Flatpak安装的会独立在特定目录。总结下来应该优先用which/dpkg,再用进程查询,最后考虑手动搜索,这样步骤比较合理。</think> 要查找Linux系统中已安装软件的具体置,可以根据不同情况采用以下方法(按优先级排序): --- ### 一、通过命令行定(推荐) #### 1. 查找可执行文件路径 ```bash which <软件名> # 例如:which firefox whereis <软件名> # 例如:whereis python ``` - **说明**:`which`返回终端调用的可执行文件路径;`whereis`额外显示手册和源码置[^1] #### 2. 查询包管理器安装的软件 ```bash # Debian/Ubuntu系 dpkg -L <包名> # 列出所有安装文件路径,例如:dpkg -L vim # RedHat/CentOS系 rpm -ql <包名> # 例如:rpm -ql httpd ``` #### 3. 通过进程定运行中的软件 ```bash ps aux | grep <软件名> # 获取进程PID pwdx <PID> # 显示进程工作目录 ``` 或直接查看符号链接: ```bash ls -l /proc/<PID>/exe # 查看实际执行文件路径 ``` --- ### 二、通用搜索方法 #### 1. 查找配置文件 ```bash find / -name "*<软件名>*" 2>/dev/null | grep -i conf ``` - **技巧**:软件通常会在`/etc/`或用户目录留下配置文件[^2] #### 2. 搜索关键文件 ```bash locate <软件名> # 需提前运行 sudo updatedb find / -iname "*<软件名>*" 2>/dev/null ``` --- ### 三、特殊情况处理 1. **手动编译安装的软件** - 默认路径:`/usr/local/` (如`/usr/local/bin/`存放可执行文件) - 安装日志:检查`/var/log/`或源码目录的`install_manifest.txt` 2. **Flatpak/Snap应用** ```bash flatpak list --app --columns=application,installation snap list ``` 3. **桌面快捷方式定** - 检查`/usr/share/applications/`或`~/.local/share/applications/`中的`.desktop`文件 - 用文本编辑器打开,查看`Exec=`或`Path=`字段[^3] --- ### 总结排查路线 ```mermaid graph TD A[已知软件名] --> B{是否在运行?} B -- 是 --> C[用 ps/pwdx 定进程路径] B -- 否 --> D{是否通过包管理安装?} D -- 是 --> E[dpkg/rpm -ql] D -- 否 --> F[尝试 which/whereis] F --> G{是否定成功?} G -- 否 --> H[全盘搜索或检查 /opt /usr/local] ``` > **注意**:部分软件可能分散在多个目录(如可执行文件在`/usr/bin/`,库文件在`/usr/lib/`),建议结合多种方法验证。需root权限的目录搜索请添加`sudo`[^1][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值