たとえば、テキストファイルが次の場合:
blue
green
yellow
black
ここには4行ありますが、結果を4として取得したいと思います。どうやってやるの?
sum()
をジェネレーター式で使用できます。
_with open('data.txt') as f:
print sum(1 for _ in f)
_
f
は イテレータ であるため、len(f)
を使用できないことに注意してください。 __
_はスローアウェイ変数の特別な変数名です。 Pythonの単一アンダースコア「_」変数の目的は何ですか? を参照してください。
len(f.readlines())
を使用できますが、これによりメモリに追加のリストが作成され、メモリに収まらない巨大なファイルでも機能しなくなります。
このリンク( Pythonで行数を安く取得する方法 )には多くの潜在的な解決策がありますが、これらはすべて、この実行をかなり速くする1つの方法を無視します。 bytearrays、および独自のバッファリングを行います。
タイミングツールの修正版を使用すると、次のコードは提供されているどのソリューションよりも高速(およびわずかにPythonic)であると思います。
def _make_gen(reader):
b = reader(1024 * 1024)
while b:
yield b
b = reader(1024*1024)
def rawpycount(filename):
f = open(filename, 'rb')
f_gen = _make_gen(f.raw.read)
return sum( buf.count(b'\n') for buf in f_gen )
私のタイミングは次のとおりです。
rawpycount 0.0048 0.0046 1.00
bufcount 0.0074 0.0066 1.43
wccount 0.01 0.01 2.17
itercount 0.014 0.014 3.04
opcount 0.021 0.02 4.43
kylecount 0.023 0.021 4.58
simplecount 0.022 0.022 4.81
mapcount 0.038 0.032 6.82
私はそこに投稿しますが、私はスタック交換の比較的新しいユーザーであり、必要なマナを持っていません。
編集:
これはitertoolsを使用してジェネレーター式をインラインで完全に行うことができますが、かなり奇妙に見えます:
from itertools import (takewhile,repeat)
def rawbigcount(filename):
f = open(filename, 'rb')
bufgen = takewhile(lambda x: x, (f.raw.read(1024*1024) for _ in repeat(None)))
return sum( buf.count(b'\n') for buf in bufgen if buf )
ここで、ジェネレータ式でsum()
を使用できます。ジェネレータ式は、ファイルの長さまで_[1, 1, ...]
_になります。次に、sum()
を呼び出して、それらをすべて加算して合計カウントを取得します。
_with open('text.txt') as myfile:
count = sum(1 for line in myfile)
_
あなたが試したことによって、空の行を含めたくないようです。その後、次のことができます。
_with open('text.txt') as myfile:
count = sum(1 for line in myfile if line.rstrip('\n'))
_
count=0
with open ('filename.txt','rb') as f:
for line in f:
count+=1
print count
一発ギャグ:
total_line_count = sum(1 for line in open("filename.txt"))
print(total_line_count)
リスト内包表記を使用してこれを実行する方法を次に示しますが、line.strip()が2回呼び出されているため、コンピューターのメモリが少し無駄になります。
with open('textfile.txt') as file:
lines =[
line.strip()
for line in file
if line.strip() != '']
print("number of lines = {}".format(len(lines)))
これは、ファイルのno.of行も提供します。
a=open('filename.txt','r')
l=a.read()
count=l.splitlines()
print(len(count))
つかいます:
num_lines = sum(1 for line in open('data.txt'))
print(num_lines)
それは動作します。
with open ("filename.txt","r") as f
を使用するように言っている人には、anyname = open("filename.txt","r")
を実行できます
def main():
file = open("infile.txt",'r')
count = 0
for line in file:
count+=1
print (count)
main ()
pandas
をインポートする場合、 shape
関数を使用してこれを決定できます。それがどのように実行されるかわからない。コードは次のとおりです。
import pandas as pd
data=pd.read_csv("yourfile") #reads in your file
num_records=[] #creates an array
num_records=data.shape #assigns the 2 item result from shape to the array
n_records=num_records[0] #assigns number of lines to n_records
私はstackoverflowに慣れていません。アカウントを持っていなかったので、通常は答えを求めてここに来ました。まだコメントしたり、回答に投票したりすることはできません。しかし、上記のMichael Baconのコードは本当にうまく機能していると言いたかったのです。私はPythonですが、プログラミングには慣れていません。私は読んでいますPythonクラッシュコースと読書を分割するためにやりたいことがいくつかありますETLまたはデータ品質の観点からも使用できるユーティリティの1つは、ETLから独立してファイルの行カウントをキャプチャすることです。ファイルにはX行があり、SQLまたはHadoopにインポートして終了します。最大X行のローデータファイルのローカウントを最低レベルで検証できます。
私は彼のコードで遊んでテストを行ってきましたが、このコードはこれまでのところ非常に効率的です。いくつかの異なるCSVファイル、さまざまなサイズ、行数を作成しました。以下の私のコードを見ることができ、私のコメントは時間と詳細を提供します。上記のMichael Baconが提供するコードは、通常のPython行をループするだけの方法よりも約6倍速く実行されます。
これが誰かを助けることを願っています。
import time
from itertools import (takewhile,repeat)
def readfilesimple(myfile):
# watch me whip
linecounter = 0
with open(myfile,'r') as file_object:
# watch me nae nae
for lines in file_object:
linecounter += 1
return linecounter
def readfileadvanced(myfile):
# watch me whip
f = open(myfile, 'rb')
# watch me nae nae
bufgen = takewhile(lambda x: x, (f.raw.read(1024 * 1024) for _ in repeat(None)))
return sum(buf.count(b'\n') for buf in bufgen if buf)
#return linecounter
# ************************************
# Main
# ************************************
#start the clock
start_time = time.time()
# 6.7 seconds to read a 475MB file that has 24 million rows and 3 columns
#mycount = readfilesimple("c:/junk/book1.csv")
# 0.67 seconds to read a 475MB file that has 24 million rows and 3 columns
#mycount = readfileadvanced("c:/junk/book1.csv")
# 25.9 seconds to read a 3.9Gb file that has 3.25 million rows and 104 columns
#mycount = readfilesimple("c:/junk/WideCsvExample/ReallyWideReallyBig1.csv")
# 5.7 seconds to read a 3.9Gb file that has 3.25 million rows and 104 columns
#mycount = readfileadvanced("c:/junk/WideCsvExample/ReallyWideReallyBig1.csv")
# 292.92 seconds to read a 43Gb file that has 35.7 million rows and 104 columns
mycount = readfilesimple("c:/junk/WideCsvExample/ReallyWideReallyBig.csv")
# 57 seconds to read a 43Gb file that has 35.7 million rows and 104 columns
#mycount = readfileadvanced("c:/junk/WideCsvExample/ReallyWideReallyBig.csv")
#stop the clock
elapsed_time = time.time() - start_time
print("\nCode Execution: " + str(elapsed_time) + " seconds\n")
print("File contains: " + str(mycount) + " lines of text.")