web-dev-qa-db-ja.com

pythonを使用してテキストファイルの行の総数を数える方法

たとえば、テキストファイルが次の場合:

blue
green
yellow
black

ここには4行ありますが、結果を4として取得したいと思います。どうやってやるの?

24
user2794146

sum() をジェネレーター式で使用できます。

_with open('data.txt') as f:
    print sum(1 for _ in f)
_

fイテレータ であるため、len(f)を使用できないことに注意してください。 ___はスローアウェイ変数の特別な変数名です。 Pythonの単一アンダースコア「_」変数の目的は何ですか? を参照してください。

len(f.readlines())を使用できますが、これによりメモリに追加のリストが作成され、メモリに収まらない巨大なファイルでも機能しなくなります。

49
alecxe

このリンク( 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 )
20
Michael Bacon

ここで、ジェネレータ式で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'))
_
8
TerryA
count=0
with open ('filename.txt','rb') as f:
    for line in f:
        count+=1

print count
5
Koustav Ghosal

一発ギャグ:

total_line_count = sum(1 for line in open("filename.txt"))

print(total_line_count)
2
Surya

リスト内包表記を使用してこれを実行する方法を次に示しますが、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)))
0
Amaan

これは、ファイルのno.of行も提供します。

a=open('filename.txt','r')
l=a.read()
count=l.splitlines()
print(len(count))
0
Naveen

つかいます:

num_lines = sum(1 for line in open('data.txt'))
print(num_lines)

それは動作します。

0
Tiebe Groosman

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 ()
0
Michell

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
0
Brian Seborg

私は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.")
0
Steven Johnson