10
votes

Comment supprimer des lignes CSV en python

J'essaie de comparer deux fichiers CSV (Filea et FileB) et supprimez toutes les lignes de FileA qui ne sont pas trouvées dans FileB. Je veux pouvoir faire cela sans créer un troisième fichier. Je pensais que je pouvais faire cela en utilisant le module de l'écrivain CSV, mais maintenant je suis maintenant je me devine moi-même.

Actuellement, j'utilise actuellement le code suivant pour enregistrer mes données de comparaison de fichier B: xxx < / Pré>

C'est ici que je suis bloqué et je ne sais pas comment supprimer les lignes: xxx


2 commentaires

SQLite est une base de données basée sur des fichiers plats et Les pilotes pour cela sont inclus dans les versions modernes de Python. Ce pourrait être une meilleure option que vous essayez de faire.


Désolé pour la question idiote mais cela créera une copie exacte du fichierb, n'est-ce pas?


3 Réponses :


3
votes

CSV n'est pas un format de base de données. Il est lu et écrit dans son ensemble. Vous ne pouvez pas enlever les rangées au milieu. Donc, la seule façon de le faire sans créer un troisième fichier est de lire complètement dans le fichier en mémoire, puis de l'écrire, sans les lignes incriminées.

Mais en général, il est préférable d'utiliser un troisième fichier.


0 commentaires

3
votes

Comme Lennart décrit, vous ne pouvez pas modifier un fichier CSV en place pendant que vous iTerez-le sur celui-ci.

Si vous êtes vraiment opposé à la création d'un tiers, vous pouvez envisager d'utiliser un tampon à chaîne avec Stringio , l'idée étant que vous accumulez le nouveau contenu souhaité du fichier A dans Mémoire. À la fin de votre script, vous pouvez écrire le contenu du tampon sur le fichier A. xxx


3 commentaires

Un mot de prudence ici: vous pouvez épuiser la mémoire disponible pour votre système si vos fichiers d'entrée sont grands.


Vous pouvez également simplement écrire dans un fichier différent et le renommer à la fin, c'est ce que ma solution fait


@jamylak, je suis complètement d'accord avec toi. Et c'est exactement ce que je ferais dans cette situation. Je viens de comprendre que cela serait utile dans ce cas, ce qui répond à la recherche technique de ce que l'Asker recherche.



8
votes

Cette solution utilise fichierInput avec emplacements = vrai < / Code>, qui écrit dans un fichier temporaire, puis renonce automatiquement à la fin de votre nom de fichier. Vous ne pouvez pas supprimer les lignes d'un fichier, mais vous pouvez le réécrire avec seulement ceux que vous voulez.

Si l'argument de mots-clés inplace = 1 est transmis à fileinput.input () ou vers le constructeur , le fichier est déplacé vers Un fichier de sauvegarde et une sortie standard sont dirigés vers le fichier d'entrée (si un fichier du même nom que le fichier de sauvegarde existe déjà, il sera remplacé en silence). Cela permet d'écrire un filtre qui réécrit son fichier d'entrée en place.

fila xxx

fileb xxx


xxx

fila xxx


6 commentaires

Une amélioration subtile non adressée dans l'explication: Ce code utilise un ensemble, une structure de données beaucoup plus optimale pour répondre "est ces données présentes?" qu'une liste (qui doit être itératée sur chaque fois).


@David op a également utilisé un ensemble cependant


D'oh. S / il a clairement fait. Eh bien, petit conseil - ne l'appelle pas une "liste" de déménagement, ou des personnes à la tête d'os comme moi deviendront confuses sur le type de la variable. =)


Quelle version de Python? Je ne crois pas que cette syntaxe soit 2,4 compatible


@Justin vous l'avez marqué comme 2,7? Vous pouvez simplement utiliser Set ((rangée [0], ligne [1]) pour la ligne in r) à la place


J'ai fait. Je m'excuse. Je n'ai pas réalisé que la maison pour mon script est sur une boîte de 2,4 jusqu'à présent.