Estou pedindo ao Python que imprima o número mínimo de uma coluna de dados CSV, mas a linha superior é o número da coluna e não quero que o Python leve em consideração a linha superior. Como posso ter certeza de que o Python ignora a primeira linha?
Este é o código até agora:
import csv
with open('all16.csv', 'rb') as inf:
incsv = csv.reader(inf)
column = 1
datatype = float
data = (datatype(column) for row in incsv)
least_value = min(data)
print least_value
Você também poderia explicar o que está fazendo, não apenas fornecer o código? Eu sou muito novo no Python e gostaria de ter certeza de que entendi tudo.
1.0
para cada linha em seu arquivo e depois pegando o mínimo, que vai ser1.0
?1.0
. :)datatype(row[column]
... é o que eu acho que o OP está tentando alcançarRespostas:
Você pode usar uma instância da classe
csv
do móduloSniffer
para deduzir o formato de um arquivo CSV e detectar se uma linha de cabeçalho está presente junto com anext()
função integrada para pular a primeira linha apenas quando necessário:Uma vez que
datatype
ecolumn
estão codificados em seu exemplo, seria um pouco mais rápido processar darow
seguinte forma:Observação: o código acima é para Python 3.x. Para Python 2.x, use a seguinte linha para abrir o arquivo em vez do que é mostrado:
fonte
has_header(file.read(1024))
, faz sentido escreverhas_header(file.readline())
? Eu vejo muito isso, mas não entendo comohas_reader()
poderia detectar se há ou não um cabeçalho de uma única linha do arquivo CSV ...Sniffer
funcionamento não é descrito. FWIW Eu nunca vihas_header(file.readline())
sendo usado e mesmo que funcionasse na maioria das vezes, eu suspeitaria muito da abordagem pelas razões apresentadas.file.read(1024)
gera erros no csv lib do python :. Veja também aqui, por exemplo.readline()
pararead(1024)
. Até agora, só consegui encontrar pessoas que mudaram para readline para resolver o problema csv.dialect.Para pular a primeira linha, basta ligar:
Os arquivos em Python são iteradores em linhas.
fonte
Em um caso de uso semelhante, tive que pular linhas irritantes antes da linha com os nomes reais das colunas. Esta solução funcionou bem. Leia o arquivo primeiro e depois passe a lista para
csv.DictReader
.fonte
data
dicionário, nem esta resposta realmente acrescenta nada em relação à aceita.data = dict()
e preencher, mas é ineficiente e não idiomático. Além disso, deve-se usar literais dict ({}
) eenumerate
mesmo assim.@Veedrac
se quiser ter certeza de que fui notificado, embora o Stack Overflow pareça ser capaz de adivinhar pelo nome de usuário. (Não escrevo@Maarten
porque o respondente será notificado por padrão.)Emprestado do livro de receitas do python ,
um código de modelo mais conciso pode ser assim:
fonte
Você normalmente usaria o
next(incsv)
que avança o iterador uma linha, portanto, pula o cabeçalho. O outro (digamos que você queira pular 30 linhas) seria:fonte
use csv.DictReader em vez de csv.Reader. Se o parâmetro fieldnames for omitido, os valores na primeira linha do csvfile serão usados como nomes de campo. você poderia acessar os valores dos campos usando a linha ["1"] etc.
fonte
O novo pacote 'pandas' pode ser mais relevante do que 'csv'. O código abaixo irá ler um arquivo CSV, por padrão interpretando a primeira linha como o cabeçalho da coluna e encontrar o mínimo nas colunas.
fonte
pd.read_csv('all16.csv').min()
Bem, minha minibiblioteca de invólucro também faria o trabalho.
Enquanto isso, se você souber qual é o índice de coluna de cabeçalho um, por exemplo, "Coluna 1", você pode fazer isso:
fonte
Para mim, a maneira mais fácil de fazer é usar o alcance.
fonte
Porque isso está relacionado a algo que eu estava fazendo, vou compartilhar aqui.
E se não tivermos certeza se há um cabeçalho e você também não quiser importar um sniffer e outras coisas?
Se sua tarefa for básica, como imprimir ou anexar a uma lista ou array, você pode usar apenas uma instrução if:
fonte
A documentação para o módulo Python 3 CSV fornece este exemplo:
O
Sniffer
tentará detectar automaticamente muitas coisas sobre o arquivo CSV. Você precisa chamar explicitamente seuhas_header()
método para determinar se o arquivo tem uma linha de cabeçalho. Em caso afirmativo, pule a primeira linha ao iterar as linhas CSV. Você pode fazer assim:fonte
Eu usaria o tail para me livrar da primeira linha indesejada:
fonte
basta adicionar [1:]
exemplo abaixo:
que funciona para mim no iPython
fonte
Python 3.X
Lida com UTF8 BOM + HEADER
Foi muito frustrante que o
csv
módulo não conseguisse obter o cabeçalho facilmente, há também um bug com o BOM UTF-8 (primeiro caractere no arquivo). Isso funciona para mim usando apenas ocsv
módulo:fonte
Gostaria de converter csvreader para list e, em seguida, pop o primeiro elemento
fonte
Python 2.x
csvreader.next()
Python 3.x
csvreader.__next__()
fonte