テキストファイルの読み取り中に最初の17行をスキップします。
ファイルが次のように見えるとしましょう:
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
good stuff
良いものが欲しいだけです。私がやっていることはもっと複雑ですが、これは私が問題を抱えている部分です。
以下のようなスライスを使用します。
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
つかいます - 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
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」よりも複雑な場合(ただし、相互依存ではない場合)に簡単に拡張できます。
このソリューションは、linetostart
変数で指定された行数をスキップするのに役立ちました。これらも追跡したい場合は、インデックス(int)と行(string)を取得します。この場合、linetostartを18に置き換えるか、18をlinetostart変数に割り当てます。
f = open("file.txt", 'r')
for i, line in enumerate(f, linetostart):
#Your code
上位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メソッドの方が効率的です。
テーブルの場合。
pd.read_table("path/to/file", sep="\t", index_col=0, skiprows=17)
ファイル内の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を取得します。
ファイル全体を一度にメモリに読みたくない場合は、いくつかのトリックを使用できます。
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)