CSV Python에 몇 줄이 있습니까?


109

CSV 파일을 읽기 위해 Python (Django Framework)을 사용하고 있습니다. 보시다시피이 CSV에서 2 줄만 가져옵니다. 내가하려는 것은 CSV의 총 행 수를 변수에 저장하는 것입니다.

총 행 수는 어떻게 얻을 수 있습니까?

file = object.myfilePath
fileObject = csv.reader(file)
for i in range(2):
    data.append(fileObject.next()) 

나는 시도했다 :

len(fileObject)
fileObject.length

1
무엇입니까 file_read? 파일 핸들 file_read = open("myfile.txt")입니까?
David Robinson

1
file_read = csv.reader (file) 업데이트 된 질문이 이제 의미가있을 것입니다.
GrantU

해당 주제에 대한 생각을 보려면이 질문을 살펴보십시오 : stackoverflow.com/questions/845058/…
파쇄 됨

답변:


181

행 수를 계산해야합니다.

row_count = sum(1 for row in fileObject)  # fileObject is your csv.reader

sum()생성기 표현식과 함께 사용 하면 전체 파일을 메모리에 저장하지 않고도 효율적인 카운터를 만들 수 있습니다.

시작하기 위해 이미 2 개의 행을 읽었다면이 2 개 행을 합계에 추가해야합니다. 이미 읽은 행은 계산되지 않습니다.


1
감사. 작동하지만 먼저 줄을 읽어야합니까? 약간 히트 한 것 같나요?
GrantU

4
당신은 라인을 읽을; 줄은 고정 된 크기로 보장되지 않으므로 계산하는 유일한 방법은 모두 읽는 것입니다.
Martijn Pieters

1
@Escachator : 어떤 플랫폼을 사용하고 있습니까? 파일에 EOF ( CTRL-Z,\x1A ) 문자가 있습니까? 당신은 어떻게 않았다 열고 파일을?
Martijn Pieters

4
@Escachator : 파일 이름은 53 자입니다. 판독기는 파일 이름이 아닌 반복 가능 또는 열린 파일 개체를 사용합니다.
Martijn Pieters

6
그런 다음 판독기를 다시 반복하려면 (예 : 행을 처리하기 위해) 반복자를 재설정하고 판독기 객체를 다시 만들어야합니다. file.seek(0)그런 다음fileObject = csv.reader(file)
KevinTydlacka

67

2018-10-29 수정

의견을 보내 주셔서 감사합니다.

속도 측면에서 csv 파일의 줄 수를 얻기 위해 여러 종류의 코드를 테스트했습니다. 가장 좋은 방법은 다음과 같습니다.

with open(filename) as f:
    sum(1 for line in f)

다음은 테스트 된 코드입니다.

import timeit
import csv
import pandas as pd

filename = './sample_submission.csv'

def talktime(filename, funcname, func):
    print(f"# {funcname}")
    t = timeit.timeit(f'{funcname}("{filename}")', setup=f'from __main__ import {funcname}', number = 100) / 100
    print('Elapsed time : ', t)
    print('n = ', func(filename))
    print('\n')

def sum1forline(filename):
    with open(filename) as f:
        return sum(1 for line in f)
talktime(filename, 'sum1forline', sum1forline)

def lenopenreadlines(filename):
    with open(filename) as f:
        return len(f.readlines())
talktime(filename, 'lenopenreadlines', lenopenreadlines)

def lenpd(filename):
    return len(pd.read_csv(filename)) + 1
talktime(filename, 'lenpd', lenpd)

def csvreaderfor(filename):
    cnt = 0
    with open(filename) as f:
        cr = csv.reader(f)
        for row in cr:
            cnt += 1
    return cnt
talktime(filename, 'csvreaderfor', csvreaderfor)

def openenum(filename):
    cnt = 0
    with open(filename) as f:
        for i, line in enumerate(f,1):
            cnt += 1
    return cnt
talktime(filename, 'openenum', openenum)

결과는 아래와 같습니다.

# sum1forline
Elapsed time :  0.6327946722068599
n =  2528244


# lenopenreadlines
Elapsed time :  0.655304473598555
n =  2528244


# lenpd
Elapsed time :  0.7561274056295324
n =  2528244


# csvreaderfor
Elapsed time :  1.5571560935772661
n =  2528244


# openenum
Elapsed time :  0.773000013928679
n =  2528244

결론적 sum(1 for line in f)으로 가장 빠릅니다. 그러나 len(f.readlines()).

sample_submission.csv 30.2MB이고 3,100 만 자입니다.


파일도 닫아야합니까? 공간을 절약하기 위해?
lesolorzanov

1
결론에서 len ()보다 sum ()을 선호하는 이유는 무엇입니까? Len ()은 결과가 더 빠릅니다!
jorijnsmit

좋은 대답입니다. 하나 추가. 느리지 만 rfc4180for row in csv_reader: 에 따라 CSV에 유효한 인용 줄 바꿈이 포함 되어야하는 경우 솔루션을 선호해야합니다 . @dixhom 테스트 한 파일의 크기는 얼마입니까?
Simon Lang

16

이를 수행하려면 여기에 내 예제와 같은 코드가 필요합니다.

file = open("Task1.csv")
numline = len(file.readlines())
print (numline)

이것이 모두에게 도움이되기를 바랍니다.


1
나는이 짧은 대답을 좋아하지만 Martijn Pieters의 대답보다 느립니다. 1,000 만 회선의 경우 %time sum(1 for row in open("df_data_raw.csv")) 4.91 초, %time len(open("df_data_raw.csv").readlines())비용은 14.6 초입니다.
Pengju Zhao

10

위의 몇 가지 제안은 csv 파일의 줄 수를 계산합니다. 그러나 일부 CSV 파일에는 줄 바꿈 문자가 포함 된 인용 문자열이 포함됩니다. MS CSV 파일은 일반적으로 \ r \ n으로 레코드를 구분하지만 따옴표로 묶인 문자열 내에서 \ n 만 사용합니다.

이와 같은 파일의 경우 파일에서 텍스트 줄 (개행으로 구분)을 세면 결과가 너무 커집니다. 따라서 정확한 카운트를 위해 csv.reader를 사용하여 레코드를 읽어야합니다.


6

먼저 열린 상태로 파일을 열어야합니다.

input_file = open("nameOfFile.csv","r+")

그런 다음 csv.reader를 사용하여 csv를 엽니 다.

reader_file = csv.reader(input_file)

마지막으로 'len'명령으로 행 수를 가져올 수 있습니다.

value = len(list(reader_file))

총 코드는 다음과 같습니다.

input_file = open("nameOfFile.csv","r+")
reader_file = csv.reader(input_file)
value = len(list(reader_file))

csv 파일을 재사용하려면 input_file.fseek (0)을 만들어야합니다. reader_file에 대한 목록을 사용하면 모든 파일을 읽고 파일의 포인터가 위치를 변경하기 때문입니다.


6

row_count = sum(1 for line in open(filename)) 나를 위해 일했습니다.

참고 : sum(1 for line in csv.reader(filename))첫 번째 줄의 길이를 계산하는 것 같습니다 .


첫 번째는 파일의 줄 수를 세는 것입니다. 당신의 CSV 문자열에서 줄 바꿈이있는 경우, 그것은 정확한 결과를 보여 실 거예요
다닐 수자 모라에스에게

3
numline = len(file_read.readlines())

2
file_read명백하게 csv.reader()그것을하지 않도록 객체는 readlines() 방법. .readlines()잠재적으로 큰 목록을 만들어야합니다. 그런 다음 다시 삭제해야합니다.
Martijn Pieters

1
이 답변을 쓸 때 csv에 대한 정보가없는 주제는 csv 리더 객체입니다.
Alex Troush 2013

3

csv.reader 객체를 인스턴스화하고 전체 파일을 반복 할 때 행 수를 제공하는 line_num이라는 인스턴스 변수에 액세스 할 수 있습니다.

import csv
with open('csv_path_file') as f:
    csv_reader = csv.reader(f)
    for row in csv_reader:
        pass
    print(csv_reader.line_num)

2
import csv
count = 0
with open('filename.csv', 'rb') as count_file:
    csv_reader = csv.reader(count_file)
    for row in csv_reader:
        count += 1

print count

2

더 작업하기 쉬운 개체에 맞추려면 "목록"을 사용하십시오.

그런 다음 마음의 원할 때까지 셀 수 있고, 건너 뛰고, 돌연변이 할 수 있습니다.

list(fileObject) #list values

len(list(fileObject)) # get length of file lines

list(fileObject)[10:] # skip first 10 lines

2

이것은 csv 및 Unix 기반 OS의 문자열을 포함하는 모든 파일에서 작동합니다.

import os

numOfLines = int(os.popen('wc -l < file.csv').read()[:-1])

csv 파일에 필드 행이 포함 된 경우 numOfLines위에서 하나를 공제 할 수 있습니다 .

numOfLines = numOfLines - 1

이것은 파이썬 스크립트에 통합하는 데 매우 편리합니다. +1
Vitalis

2

클래식 for 루프를 사용할 수도 있습니다.

import pandas as pd
df = pd.read_csv('your_file.csv')

count = 0
for i in df['a_column']:
    count = count + 1

print(count)

1

명령 줄에서 아래와 같이 간단한 작업을 시도 할 수 있습니다.

sed -n '$=' filename 또는 wc -l filename


큰 따옴표 안에 줄 바꿈이 있으면 어떻게됩니까? 이는 여전히 동일한 기록의 일부로 간주되어야합니다. 이 답변은 잘못된 것입니다
다닐 수자 모라에스

1

최선의 답변을 조금 개선 할 수 있다고 생각합니다.

len = sum(1 for _ in reader)

더욱이, 우리는 파이썬 코드가 항상 프로젝트에서 최고의 성능을 가지는 것은 아니라는 것을 잊지 말아야합니다. 예 : 동일한 데이터 세트에서 동시에 더 많은 작업을 수행 할 수 있다면 동일한 bucle에서 모두 수행하는 것이 대신 두 개 이상의 pythonic bucle을 만드는 것이 좋습니다.


0

시험

data = pd.read_csv("data.csv")
data.shape

출력에서 (aa, bb)와 같은 것을 볼 수 있습니다. 여기서 aa는 행 수입니다.


물건을
넘어서서

오,하지만 당신은data.shape[0]
dedricF

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.