web-dev-qa-db-ja.com

Pythonファイルで行を読みながら、最初の数行をスキップします

テキストファイルの読み取り中に最初の17行をスキップします。

ファイルが次のように見えるとしましょう:

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

良いものが欲しいだけです。私がやっていることはもっと複雑ですが、これは私が問題を抱えている部分です。

48
O.rka

以下のようなスライスを使用します。

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
97
wim

つかいます - 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
28
Ismail Badawi
for line in 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」よりも複雑な場合(ただし、相互依存ではない場合)に簡単に拡張できます。

3
ninjagecko

このソリューションは、linetostart変数で指定された行数をスキップするのに役立ちました。これらも追跡したい場合は、インデックス(int)と行(string)を取得します。この場合、linetostartを18に置き換えるか、18をlinetostart変数に割り当てます。

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

上位2つの回答のtimeit結果を以下に示します。 「file.txt」は、ファイルサイズが1MB以上の100,000行以上のランダムな文字列を含むテキストファイルであることに注意してください。

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

2つの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メソッドの方が効率的です。

0
willywonka

テーブルの場合。

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

0
O.rka

ファイル内の2つの行番号の間の行を取得する方法を次に示します。

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\n', 'Zyryan\n', 'zythem\n', 'Zythia\n', 'zythum\n', 'Zyzomys\n', 'Zyzzogeton\n']
['A\n', 'a\n', 'aa\n', 'aal\n', 'aalii\n', 'aam\n', 'Aani\n', 'aardvark\n', 'aardwolf\n', 'Aaron\n']

1行のパラメーターから呼び出して、n行目からEOFを取得します。

0
the wolf

ファイル全体を一度にメモリに読みたくない場合は、いくつかのトリックを使用できます。

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)
0
Azsgy