Je demande à Python d'imprimer le nombre minimum d'une colonne de données CSV, mais la ligne du haut est le numéro de la colonne, et je ne veux pas que Python prenne en compte la ligne du haut. Comment puis-je m'assurer que Python ignore la première ligne?
Voici le code pour l'instant:
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
Pourriez-vous également expliquer ce que vous faites, pas seulement donner le code? Je suis très très nouveau sur Python et je voudrais m'assurer de tout comprendre.
1.0
pour chaque ligne de votre fichier et que vous prenez ensuite le minimum, ce qui va être1.0
?1.0
. :)datatype(row[column]
... c'est ce que je suppose que l'OP essaie de réaliserRéponses:
Vous pouvez utiliser une instance de la classe
csv
du moduleSniffer
pour déduire le format d'un fichier CSV et détecter si une ligne d'en-tête est présente avec lanext()
fonction intégrée pour sauter la première ligne uniquement lorsque cela est nécessaire:Puisque
datatype
etcolumn
sont codés en dur dans votre exemple, il serait légèrement plus rapide de traiterrow
comme ceci:Remarque: le code ci-dessus est pour Python 3.x. Pour Python 2.x, utilisez la ligne suivante pour ouvrir le fichier au lieu de ce qui est affiché:
la source
has_header(file.read(1024))
, cela a-t-il un sens d'écrirehas_header(file.readline())
? Je vois beaucoup cela, mais je ne comprends pas commenthas_reader()
pourrait détecter s'il y a ou non un en-tête à partir d'une seule ligne du fichier CSV ...Sniffer
travaux ne sont pas décrits. FWIW Je n'ai jamais vuhas_header(file.readline())
être utilisé et même si cela fonctionnait la plupart du temps, je serais très méfiant de l'approche pour les raisons énoncées.file.read(1024)
génère des erreurs dans csv python lib :. Voir aussi ici par exemple.readline()
àread(1024)
. Jusqu'à présent, je n'ai réussi à trouver que des personnes qui sont passées à readline pour résoudre le problème de csv.dialect.Pour sauter la première ligne, appelez simplement:
Les fichiers en Python sont des itérateurs sur des lignes.
la source
Dans un cas d'utilisation similaire, j'ai dû sauter des lignes ennuyeuses avant la ligne avec mes noms de colonnes réels. Cette solution a bien fonctionné. Lisez d'abord le fichier, puis passez la liste à
csv.DictReader
.la source
data
dictionnaire, et cette réponse n'ajoute pas vraiment quoi que ce soit par rapport à celle acceptée.data = dict()
et de le remplir, mais c'est inefficace et pas idiomatique. De plus, il faut utiliser dict literals ({}
) etenumerate
même alors.@Veedrac
si vous voulez être sûr d'être averti, bien que Stack Overflow semble être capable de deviner à partir du nom d'utilisateur. (Je n'écris pas@Maarten
car le répondeur sera averti par défaut.)Emprunté au livre de recettes python ,
un code de modèle plus concis pourrait ressembler à ceci:
la source
Vous utiliseriez normalement
next(incsv)
ce qui avance l'itérateur d'une ligne, vous ignorez donc l'en-tête. L'autre (disons que vous vouliez sauter 30 lignes) serait:la source
utilisez csv.DictReader au lieu de csv.Reader. Si le paramètre fieldnames est omis, les valeurs de la première ligne du fichier csv seront utilisées comme noms de champ. vous pourrez alors accéder aux valeurs de champ en utilisant la ligne ["1"] etc
la source
Le nouveau paquet «pandas» pourrait être plus pertinent que «csv». Le code ci-dessous lira un fichier CSV, interprétant par défaut la première ligne comme en-tête de colonne et trouvera le minimum entre les colonnes.
la source
pd.read_csv('all16.csv').min()
Eh bien, ma mini bibliothèque de wrapper ferait également l'affaire.
En attendant, si vous savez quel est l'index de colonne d'en-tête un, par exemple "Colonne 1", vous pouvez le faire à la place:
la source
Pour moi, le moyen le plus simple est d'utiliser la gamme.
la source
Parce que cela est lié à quelque chose que je faisais, je vais partager ici.
Que faire si nous ne savons pas s'il y a un en-tête et que vous n'avez pas non plus envie d'importer du sniffer et d'autres choses?
Si votre tâche est basique, comme l'impression ou l'ajout à une liste ou un tableau, vous pouvez simplement utiliser une instruction if:
la source
La documentation du module CSV Python 3 fournit cet exemple:
Le
Sniffer
essaiera de détecter automatiquement de nombreuses choses sur le fichier CSV. Vous devez appeler explicitement sahas_header()
méthode pour déterminer si le fichier a une ligne d'en-tête. Si tel est le cas, ignorez la première ligne lors de l'itération des lignes CSV. Vous pouvez le faire comme ceci:la source
J'utiliserais tail pour me débarrasser de la première ligne indésirable:
la source
ajoutez simplement [1:]
exemple ci-dessous:
cela fonctionne pour moi dans iPython
la source
Python 3.X
Poignées UTF8 BOM + HEADER
C'était assez frustrant que le
csv
module ne puisse pas facilement obtenir l'en-tête, il y a aussi un bogue avec la nomenclature UTF-8 (premier caractère du fichier). Cela fonctionne pour moi en utilisant uniquement lecsv
module:la source
Je convertirais csvreader en liste, puis ferais apparaître le premier élément
la source
Python 2.x
csvreader.next()
Python 3.x
csvreader.__next__()
la source