回答:
Python 2
with open("datafile") as myfile:
head = [next(myfile) for x in xrange(N)]
print head
Python 3
with open("datafile") as myfile:
head = [next(myfile) for x in range(N)]
print(head)
これが別の方法です(Python 2とPythonの両方)
from itertools import islice
with open("datafile") as myfile:
head = list(islice(myfile, N))
print head
N = 10
with open("file.txt", "a") as file: # the a opens it in append mode
for i in range(N):
line = next(file).strip()
print(line)
f = open("file")
ファイルを閉じるための例外処理なしで、いつでも私はうんざりしています。Pythonicの方法でファイルを処理するには、コンテキストマネージャを使用します。つまり、withステートメントを使用します。これについては、入出力Pythonチュートリアルで説明しています。"It is good practice to use the with keyword when dealing with file objects. This has the advantage that the file is properly closed after its suite finishes, even if an exception is raised on the way."
最初の行をすばやく読みたい場合で、パフォーマンスを気にしない場合は、.readlines()
which を使用してリストオブジェクトを返し、リストをスライスできます。
たとえば、最初の5行の場合:
with open("pathofmyfileandfileandname") as myfile:
firstNlines=myfile.readlines()[0:5] #put here the interval you want
注:ファイル全体が読み込まれるため、パフォーマンスの観点からは最適ではありませんが、使いやすく、書き込みが速く、覚えやすいので、一度だけ計算を実行する場合は非常に便利です。
print firstNlines
他の回答と比較した1つの利点は、行の範囲を簡単に選択できることです。たとえば、最初の10行[10:30]
または最後の10 行をスキップしたり、[:-10]
偶数行のみを取得したりできます[::2]
。
私が行うことは、を使用してN行を呼び出すことですpandas
。私はパフォーマンスは最高ではないと思いますが、例えばN=1000
:
import pandas as pd
yourfile = pd.read('path/to/your/file.csv',nrows=1000)
nrows
1000に設定でき、ファイル全体が読み込まれないオプションを使用することをお勧めします。pandas.pydata.org/pandas-docs/stable/generated/…一般に、pandasには、これと他の大きなファイル用のメモリ節約テクニックがあります。
sep
列区切り文字を定義するために追加することもできます(非csvファイルでは発生しないはずです)
pandas.read()
ドキュメントで関数を見つけることができません。この件に関する情報を知っていますか?
ファイルオブジェクトによって公開された行数を読み取る特定の方法はありません。
最も簡単な方法は次のようになると思います:
lines =[]
with open(file_name) as f:
lines.extend(f.readline() for i in xrange(N))
gnibblerのトップ投票の回答(2009年11月20日0:27)に基づく:このクラスは、head()およびtail()メソッドをファイルオブジェクトに追加します。
class File(file):
def head(self, lines_2find=1):
self.seek(0) #Rewind file
return [self.next() for x in xrange(lines_2find)]
def tail(self, lines_2find=1):
self.seek(0, 2) #go to end of file
bytes_in_file = self.tell()
lines_found, total_bytes_scanned = 0, 0
while (lines_2find+1 > lines_found and
bytes_in_file > total_bytes_scanned):
byte_block = min(1024, bytes_in_file-total_bytes_scanned)
self.seek(-(byte_block+total_bytes_scanned), 2)
total_bytes_scanned += byte_block
lines_found += self.read(1024).count('\n')
self.seek(-total_bytes_scanned, 2)
line_list = list(self.readlines())
return line_list[-lines_2find:]
使用法:
f = File('path/to/file', 'r')
f.head(3)
f.tail(3)
これを行う最も直感的な2つの方法は次のとおりです。
ファイルを行ごとに、行のbreak
後に繰り返しますN
。
next()
メソッドN
times を使用して、ファイルを行ごとに繰り返します。(これは基本的に、トップアンサーが行うことの異なる構文です)
これがコードです:
# Method 1:
with open("fileName", "r") as f:
counter = 0
for line in f:
print line
counter += 1
if counter == N: break
# Method 2:
with open("fileName", "r") as f:
for i in xrange(N):
line = f.next()
print line
肝心なのは、ファイル全体を使用しreadlines()
たりenumerate
、メモリに格納したりしない限り、多くのオプションがあります。
私自身で最も便利な方法:
LINE_COUNT = 3
print [s for (i, s) in enumerate(open('test.txt')) if i < LINE_COUNT]
リスト内包に基づくソリューション 関数open()は反復インターフェースをサポートしています。enumerate()はopen()をカバーし、タプル(インデックス、アイテム)を返します。次に、許容範囲内にあることを確認し(i <LINE_COUNTの場合)、結果を出力します。
Pythonをお楽しみください。;)
[next(file) for _ in range(LINE_COUNT)]
です。
(マニュアルで難解なものを検索せずに)インポートなしで機能し、Python 2.xバージョン(2.2から2.6)のかなりの範囲でtry / exceptおよび機能するものが必要な場合:
def headn(file_name, n):
"""Like *x head -N command"""
result = []
nlines = 0
assert n >= 1
for line in open(file_name):
result.append(line)
nlines += 1
if nlines >= n:
break
return result
if __name__ == "__main__":
import sys
rval = headn(sys.argv[1], int(sys.argv[2]))
print rval
print len(rval)
非常に大きなファイルがあり、出力をnumpy配列にする場合は、np.genfromtxtを使用するとコンピューターがフリーズします。これは私の経験では非常に優れています:
def load_big_file(fname,maxrows):
'''only works for well-formed text file of space-separated doubles'''
rows = [] # unknown number of lines, so use list
with open(fname) as f:
j=0
for line in f:
if j==maxrows:
break
else:
line = [float(s) for s in line.split()]
rows.append(np.array(line, dtype = np.double))
j+=1
return np.vstack(rows) # convert list of vectors to array
Python 2.6から、IOベースクラスでより高度な関数を利用できるようになりました。したがって、上記の最高評価の回答は次のように書き換えられます。
with open("datafile") as myfile:
head = myfile.readlines(N)
print head
(StopIteration例外がスローされないため、ファイルの行数がN未満であることを心配する必要はありません。)
lines
いますが、引数はを参照していbytes
ます。
これはPython 2および3で機能します。
from itertools import islice
with open('/tmp/filename.txt') as inf:
for line in islice(inf, N, N+M):
print(line)
fname = input("Enter file name: ")
num_lines = 0
with open(fname, 'r') as f: #lines count
for line in f:
num_lines += 1
num_lines_input = int (input("Enter line numbers: "))
if num_lines_input <= num_lines:
f = open(fname, "r")
for x in range(num_lines_input):
a = f.readline()
print(a)
else:
f = open(fname, "r")
for x in range(num_lines_input):
a = f.readline()
print(a)
print("Don't have", num_lines_input, " lines print as much as you can")
print("Total lines in the text",num_lines)
#!/usr/bin/python
import subprocess
p = subprocess.Popen(["tail", "-n 3", "passlist"], stdout=subprocess.PIPE)
output, err = p.communicate()
print output
この方法は私のために働いた