Estou usando o python (Django Framework) para ler um arquivo CSV. Eu retiro apenas 2 linhas deste CSV, como você pode ver. O que venho tentando fazer é armazenar em uma variável o número total de linhas do CSV também.
Como posso obter o número total de linhas?
file = object.myfilePath
fileObject = csv.reader(file)
for i in range(2):
data.append(fileObject.next())
Eu tentei:
len(fileObject)
fileObject.length
file_read
? É um identificador de arquivo (como emfile_read = open("myfile.txt")
?Respostas:
Você precisa contar o número de linhas:
O uso
sum()
com uma expressão geradora é um contador eficiente, evitando armazenar todo o arquivo na memória.Se você já leu 2 linhas para começar, então você precisa adicionar essas 2 linhas ao seu total; linhas que já foram lidas não estão sendo contadas.
fonte
\x1A
) no arquivo? Como você abriu o arquivo?file.seek(0)
entãofileObject = csv.reader(file)
EDITAR 29/10/2018
Obrigado pelos comentários.
Testei vários tipos de código para obter o número de linhas em um arquivo csv em termos de velocidade. O melhor método está abaixo.
Aqui está o código testado.
O resultado ficou abaixo.
Em conclusão,
sum(1 for line in f)
é o mais rápido. Mas pode não haver diferença significativa delen(f.readlines())
.sample_submission.csv
tem 30,2 MB e 31 milhões de caracteres.fonte
for row in csv_reader:
solução quando o CSV deve conter novas linhas entre aspas válidas de acordo com rfc4180 . @dixhom qual era o tamanho do arquivo que você testou?Para fazer isso, você precisa ter um pouco de código como meu exemplo aqui:
Eu espero que isso ajude a todos.
fonte
%time sum(1 for row in open("df_data_raw.csv"))
custa 4,91s enquanto%time len(open("df_data_raw.csv").readlines())
custa 14,6s.Várias das sugestões acima contam o número de LINHAS no arquivo csv. Mas alguns arquivos CSV conterão strings entre aspas, que por sua vez contêm caracteres de nova linha. Os arquivos MS CSV geralmente delimitam os registros com \ r \ n, mas usam \ n sozinho nas strings entre aspas.
Para um arquivo como este, contar linhas de texto (conforme delimitado por nova linha) no arquivo dará um resultado muito grande. Portanto, para uma contagem precisa, você precisa usar csv.reader para ler os registros.
fonte
Primeiro você tem que abrir o arquivo com
Em seguida, use o csv.reader para abrir o csv
Por último, você pode pegar o número de linhas com a instrução 'len'
O código total é este:
Lembre-se que se você quiser reutilizar o arquivo csv, você deve fazer um input_file.fseek (0), porque quando você usa uma lista para o reader_file, ele lê todos os arquivos, e o ponteiro no arquivo muda sua posição
fonte
row_count = sum(1 for line in open(filename))
trabalhou para mim.Nota:
sum(1 for line in csv.reader(filename))
parece calcular o comprimento da primeira linhafonte
fonte
file_read
é aparentemente umcsv.reader()
objeto, portanto, não tem umreadlines()
método..readlines()
tem que criar uma lista potencialmente grande, que você então descarta novamente.ao instanciar um objeto csv.reader e iterar o arquivo inteiro, você pode acessar uma variável de instância chamada line_num fornecendo a contagem de linhas:
fonte
fonte
Use "lista" para ajustar um objeto mais funcional.
Você pode então contar, pular, mudar até o desejo do seu coração:
fonte
Isso funciona para csv e todos os arquivos contendo strings em sistemas operacionais baseados em Unix:
Caso o arquivo csv contenha uma linha de campos, você pode deduzir um do
numOfLines
acima:fonte
Você também pode usar um loop for clássico:
fonte
pode querer tentar algo tão simples como abaixo na linha de comando:
sed -n '$=' filename
ouwc -l filename
fonte
Acho que podemos melhorar um pouco a melhor resposta, estou usando:
Além disso, não devemos esquecer que o código pythônico nem sempre tem o melhor desempenho no projeto. Por exemplo: Se pudermos fazer mais operações ao mesmo tempo no mesmo conjunto de dados, é melhor fazer todas no mesmo bucle, em vez de fazer dois ou mais bucles pitônicos.
fonte
fonte
experimentar
e na saída você pode ver algo como (aa, bb) onde aa é o número de linhas
fonte
data.shape[0]