Ont csv.lecteur de dire quand il est sur la dernière ligne
Apparemment, certains de sortie csv mise en œuvre quelque part tronque les séparateurs de champ à partir de la droite sur la dernière ligne et seule la dernière ligne du fichier lorsque les champs sont nuls.
Exemple d'entrée csv, les champs 'c' et 'd' sont nullable:
a|b|c|d
1|2||
1|2|3|4
3|4||
2|3
Dans quelque chose comme le script ci-dessous, comment puis-je savoir si je suis sur la dernière ligne donc je sais comment les gérer de manière appropriée?
import csv
reader = csv.reader(open('somefile.csv'), delimiter='|', quotechar=None)
header = reader.next()
for line_num, row in enumerate(reader):
assert len(row) == len(header)
....
Notez que ce que vous avez posté n'est pas un fichier CSV. CSV est l'acronyme de "Virgule Sepaerated Valeurs" - le séparateur DOIT être une virgule.
la plupart des csv implémentations vous permettent de spécifier un autre caractère utilisé comme séparateur
La seule près de CSV standard, RFC4180, ne fonctionne pas.
En Python, par docs.python.org/library/csv.html, "les séparateurs et les guillemets varier" -- en particulier le délimiteur n'est pas nécessairement une virgule, de sorte que le csv module est également utilisé pour lire les "non-virgule" valeurs séparées par des, ridicules que l'utilisation peut effectivement l'air (comme, par exemple, dans Excel, "exporter au format CSV" peut utiliser un délimiteur, en fonction dans ce cas sur les Paramètres Régionaux de Windows).
Si elle rend la personne à se sentir mieux, je pense qu'il est sûr de dire que l'entrée, je dois traiter avec ici obéit à aucune norme de toute décence.
la plupart des csv implémentations vous permettent de spécifier un autre caractère utilisé comme séparateur
La seule près de CSV standard, RFC4180, ne fonctionne pas.
En Python, par docs.python.org/library/csv.html, "les séparateurs et les guillemets varier" -- en particulier le délimiteur n'est pas nécessairement une virgule, de sorte que le csv module est également utilisé pour lire les "non-virgule" valeurs séparées par des, ridicules que l'utilisation peut effectivement l'air (comme, par exemple, dans Excel, "exporter au format CSV" peut utiliser un délimiteur, en fonction dans ce cas sur les Paramètres Régionaux de Windows).
Si elle rend la personne à se sentir mieux, je pense qu'il est sûr de dire que l'entrée, je dois traiter avec ici obéit à aucune norme de toute décence.
OriginalL'auteur | 2009-06-09
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, vous ne savez que vous avez épuisé après vous avez épuisé. De sorte que vous pouvez rassembler le
reader
itérateur, par exemple comme suit:et modifier votre code:
etc.
itertools
ne pas avoir quelque chose comme ça. C'est un cas d'utilisation qui est récurrent.OriginalL'auteur Alex Martelli
Si vous avez une attente d'un nombre fixe de colonnes dans chaque ligne, alors vous devriez être sur la défensive contre:
(1) TOUT ligne plus courte (par exemple, un écrivain (SQL Server /Analyseur de Requêtes IIRC) peut omettre les Zéros de fin au hasard; les utilisateurs peuvent jouer avec le fichier à l'aide d'un éditeur de texte, y compris en laissant des lignes vides.
(2) TOUT ligne, plus de temps-par exemple, les virgules ne cite pas correctement.
Vous n'avez pas besoin de toute fantaisie. Juste une vieille si-test de votre ligne de la lecture en boucle:
Oui, vous avez à gérer ses bizarreries vous-même et je suis juste en soulignant que plus de bizarreries que "manquant de fuite des champs null dans la dernière ligne" doit être cochée dans la généralité ET ils peuvent être contrôlés simplement sans code fantaisie -- je ne comprends pas votre "mais".
OriginalL'auteur John Machin
si vous souhaitez obtenir exactement la dernière ligne essayez ce code:
Si vous voulez continuer à travailler avec des valeurs à partir de la ligne procédez de la manière suivante:
OriginalL'auteur demid5111
J'en suis conscient, c'est une vieille question, mais je suis venu avec une réponse différente que ceux présentés. Le
reader
objet déjà incrémente leline_num
attribut que vous itérer dessus. Puis-je obtenir le nombre total de lignes lors de la première utilisation derow_count
, puis je le compare avec leline_num
.OriginalL'auteur Eduardo
Juste de prolonger la ligne jusqu'à la longueur de l'en-tête:
OriginalL'auteur serbaut
Pourriez-vous pas juste de capture de l'erreur lorsque le csv lecteur lit la dernière ligne dans un
essayer:
... faites vos trucs ici...
à l'exception de: StopIteration
état ?
Voir le code python suivant sur stackoverflow pour un exemple d'utilisation de l'essayer: catch: Python CSV DictReader/Écrivain questions
J'ai relu votre question, et vous avez raison, ce n'est pas ce que vous demandez - vous voulez un moyen de traiter avec la dernière ligne. Pourquoi ne pouvez-vous pas utiliser la solution par John Machin fourni ci-dessous ?
OriginalL'auteur Alex Boschmans
Si vous utilisez
for row in reader:
, il va juste arrêter la boucle après le dernier article a été lu.OriginalL'auteur Peter Rogers