[python] CSV Python에 몇 줄이 있습니까?

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



답변

행 수를 계산해야합니다.

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

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

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


답변

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 만 자입니다.


답변

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

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

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


답변

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

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


답변

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

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에 대한 목록을 사용하면 모든 파일을 읽고 파일의 포인터가 위치를 변경하기 때문입니다.


답변

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

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


답변

numline = len(file_read.readlines())