python获取文件行数,截取指定行数以后的内容

目录

python获取一个文件的行数

Python3实现从文件中读取指定行的方法

python islice()

linecache.getline


场景:设有A、B两个日志文件,A为t-1时刻的文件,B为t时刻的,日志采用增量方式(随着时间越来越大)。

需求:定期分析当前日志中上一小时的部分,即(B-A)部分

采用方法:获取A的行数(假设500),获取B的行数(假设1000),提取出501~1000行的内容

代码(因服务器环境,用的python2实现):

# -*- coding: utf-8 -*-
from itertools import islice
import sys
def main(current_dir, lasthour_dir, new_dir):
    print("当前日志:", current_dir)
    print("上个小时日志:", lasthour_dir)
    print("生成文件:", new_dir)
    
    # 获取上个小时日志行数
    count1 = 0
    file1 = open(lasthour_dir, "r")
    while True:
        buffer = file1.read(1024*8192)
        if not buffer:
            break
        count1 += buffer.count('\n')
    file1.close()
    print('上个小时日志行数:', count1)
    
    # 获取当前小时日志行数
    count2 = 0
    file2 = open(current_dir, "r")
    while True:
        buffer = file2.read(1024*8192)
        if not buffer:
            break
        count2 += buffer.count('\n')
    file2.close()
    print('当前小时日志行数:', count2)
    
    # 保存增量数据至新文件中
    f = open(current_dir, "r")
    new = open(new_dir, "w+")
    for a in islice(f, count1, count2):
        new.write(a)
    f.close()
    new.close()


main(sys.argv[1], sys.argv[2], sys.argv[3])

python获取一个文件的行数

#encoding=utf-8
#文件比较小
count=len(open(r"train.data",'r').readlines())
print(count)


#文件比较大
count=-1
for count, line in enumerate(open(r"train.data",'r')):
    pass
count+=1
print(count)


#更好的方法
count=0
thefile=open("train.data")
while True:
    buffer=thefile.read(1024*8192)
    if not buffer:
        break
    count+=buffer.count('\n')
thefile.close()
print(count)

Python3实现从文件中读取指定行的方法

python islice()

islice()获取迭代器的切片,消耗迭代器

语法:

islice(iterable, [start, ] stop [, step]):

from itertools import islice

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
a_ite = iter(a)

print(list(islice(a_ite,0,3)))
print(list(islice(a_ite,0,3)))
print(list(islice(a_ite,0,3)))

linecache.getline

# count = linecache.getline(filename,linenum)


# Python的标准库linecache模块非常适合这个任务
import linecache

the_line = linecache.getline('d:/FreakOut.cpp', 222)
print (the_line)
# linecache读取并缓存文件中所有的文本,
# 若文件很大,而只读一行,则效率低下。
# 可显示使用循环, 注意enumerate从0开始计数,而line_number从1开始
def getline(the_file_path, line_number):
  if line_number < 1:
    return ''
  for cur_line_number, line in enumerate(open(the_file_path, 'rU')):
    if cur_line_number == line_number-1:
      return line
  return ''
the_line = linecache.getline('d:/FreakOut.cpp', 222)
print (the_line)

 

### 使用 Pandas 截取或读 CSV 文件的部分数据 Pandas 提供了多种方法来高效地处理 CSV 数据,其中包括只加载特定的或列。以下是实现这一目标的具体方式: #### 方法一:通过 `usecols` 参数选择指定列 如果只需要读 CSV 中的一部分列,则可以利用 `pd.read_csv()` 的参数 `usecols` 来完成此操作[^1]。 ```python import pandas as pd # 假设我们有一个名为 'example.csv' 的文件 columns_to_read = ['Column1', 'Column3'] # 只需读这些列 df = pd.read_csv('example.csv', usecols=columns_to_read) print(df.head()) # 查看前几确认结果 ``` 上述代码会仅加载指定名称的列到 DataFrame 中,从而减少内存占用并提高效率。 --- #### 方法二:通过 `nrows` 和 `skiprows` 控制行数范围 当需要截取某一部分时,可以通过设置 `nrows` 或者组合使用 `skiprows` 实现这一点。 - **`nrows`**: 指定要读的最大行数。 - **`skiprows`**: 跳过某些后再开始读。 示例如下: ```python # 如果只想读前 10 df_first_10_rows = pd.read_csv('example.csv', nrows=10) # 如果想跳过前 5 再读接下来的 10 df_skip_and_take = pd.read_csv('example.csv', skiprows=range(1, 6), nrows=10) print(df_first_10_rows) print(df_skip_and_take) ``` 这种方法非常适合于分批处理大型 CSV 文件中的部分内容。 --- #### 方法三:基于条件筛选子集 对于已经完全载入内存的情况,也可以通过对 DataFrame 进布尔索引来提满足一定条件的数据[^3]。 假设我们需要获取某一列数值大于某个阈值的所有记录: ```python threshold_value = 50 filtered_df = df[df['Target_Column'] > threshold_value] print(filtered_df) ``` 这里的关键在于构建合适的过滤表达式以匹配实际需求。 --- #### 方法四:结合 NumPy 切片逻辑预览局部区域 虽然主要讨论的是 Pandas 功能,但如果只是简单查看而非正式分析的话,还可以借助 Numpy 数组形式快速定位感兴趣区间[^2]。 比如下面的例子展示了如何选第二至第四以及首两列的内容作为样本展示: ```python subset_array = df.iloc[1:4, :2].to_numpy() print(subset_array) ``` 注意这里的 `.iloc[]` 是位置基础的选择器;而转换成 ndarray 后即可应用熟悉的 Python 列表切片语法进一步细化访问模式。 --- ### 总结 以上介绍了四种不同场景下的解决方案——从直接限制输入源直至后期加工阶段都提供了灵活多样的工具支持。根据具体任务特点挑选最适宜的技术手段能够显著提升工作效率与程序性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值