读取 Python 文件中的行时跳过前几行
- 2025-02-27 09:07:00
- admin 原创
- 57
问题描述:
我想在读取文本文件时跳过前 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)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD