读取 Python 文件中的行时跳过前几行

2025-02-27 09:07:00
admin
原创
56
摘要:问题描述:我想在读取文本文件时跳过前 17 行。假设文件如下所示:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 good stuff 我只想要好东西。我做的事情要复杂得多,但这是我遇到麻烦的部分。解决方案 1:使用切片,如下所示:with open('yourfile.txt') as ...

问题描述:

我想在读取文本文件时跳过前 17 行。

假设文件如下所示:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
good stuff

我只想要好东西。我做的事情要复杂得多,但这是我遇到麻烦的部分。


解决方案 1:

使用切片,如下所示:

with open('yourfile.txt') as f:
    lines_after_17 = f.readlines()[17:]

如果文件太大而无法加载到内存中:

with open('yourfile.txt') as f:
    for _ in range(17):
        next(f)
    for line in f:
        # do stuff

解决方案 2:

使用itertools.islice,从索引 17 开始。它将自动跳过前 17 行。

import itertools
with open('file.txt') as f:
    for line in itertools.islice(f, 17, None):  # start=17, stop=None
        # process lines

解决方案 3:

for line in itertools.dropwhile(isBadLine, lines):
    # process as you see fit

完整演示:

from itertools import *

def isBadLine(line):
    return line=='0'

with open(...) as f:
    for line in dropwhile(isBadLine, f):
        # process as you see fit

优点:这很容易扩展到前缀行比“0”更复杂(但不相互依赖)的情况。

解决方案 4:

如果您不想一次将整个文件读入内存,可以使用一些技巧:

next(iterator)可以前进到下一行:

with open("filename.txt") as f:
     next(f)
     next(f)
     next(f)
     for line in f:
         print(f)

当然,这有点丑陋,所以 itertools 有更好的方法来做到这一点:

from itertools import islice

with open("filename.txt") as f:
    # start at line 17 and never stop (None), until the end
    for line in islice(f, 17, None):
         print(f)

解决方案 5:

以下是前 2 个答案的 timeit 结果。请注意,“file.txt”是一个文本文件,包含 100,000 多行随机字符串,文件大小为 1MB 以上。

使用 itertools:

import itertools
from timeit import timeit

timeit("""with open("file.txt", "r") as fo:
    for line in itertools.islice(fo, 90000, None):
        line.strip()""", number=100)

>>> 1.604976346003241

使用两个 for 循环:

from timeit import timeit

timeit("""with open("file.txt", "r") as fo:
    for i in range(90000):
        next(fo)
    for j in fo:
        j.strip()""", number=100)

>>> 2.427317383000627

显然,itertools 方法在处理大文件时更有效。

解决方案 6:

此解决方案帮助我跳过了变量指定的行数linetostart。如果您还想跟踪它们,则可以获取索引(int)和行(string)。对于您的情况,您可以将 linetostart 替换为 18,或将 18 分配给 linetostart 变量。

f = open("file.txt", 'r')
for i, line in enumerate(f, linetostart):
    #Your code

解决方案 7:

您可以使用 List-Comprehension 使其成为一行代码:

[fl.readline() for i in xrange(17)]

有关列表推导的更多信息,请参阅PEP 202和Python 文档。

解决方案 8:

以下是获取文件中两个行号之间的行的方法:

import sys

def file_line(name,start=1,end=sys.maxint):
    lc=0
    with open(s) as f:
        for line in f:
            lc+=1
            if lc>=start and lc<=end:
                yield line


s='/usr/share/dict/words'
l1=list(file_line(s,235880))
l2=list(file_line(s,1,10))
print l1
print l2

输出:

['Zyrian
', 'Zyryan
', 'zythem
', 'Zythia
', 'zythum
', 'Zyzomys
', 'Zyzzogeton
']
['A
', 'a
', 'aa
', 'aal
', 'aalii
', 'aam
', 'Aani
', 'aardvark
', 'aardwolf
', 'Aaron
']

只需使用一个参数调用它即可从第 n 行到 EOF

解决方案 9:

如果它是一张桌子。

pd.read_table("path/to/file", sep=" ", index_col=0, skiprows=17)

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2974  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1836  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   47  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   47  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   48  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用