0
votes

Script Python à des lignes déduplicales dans plusieurs fichiers

J'ai un grand nombre de fichiers .txt, chacun contenant une liste d'URL. Dans chaque fichier, il existe des URL dupliqués. Il n'y a pas de duplication entre les fichiers. Je veux supprimer les URL déploimer de l'intérieur dans chaque fichier.

J'ai écrit un script qui a fonctionné correctement sur un seul fichier. Maintenant, je veux le faire courir contre le grand ensemble de fichiers. P>

File "C:\Users\myscripts\myscript.py", line 66, in <module>
    lines=open(f,'r').readlines()
FileNotFoundError: [Errno 2] No such file or directory: 'myfile.txt'


0 commentaires

3 Réponses :


1
votes

Oui, vous devez ajouter le chemin relatif (chemin d'accès au répertoire) lors de l'ouverture du fichier, en tant que tel xxx

identique lorsque vous ouvrez le fichier pour écrire, remarquez que f est une chaîne et ne disposera pas des , vous devriez Readlines de l'objet renvoyé par Ouvrir , il en va de même pour Écriture

et d'ailleurs, si vous utilisez un SET , il n'est pas nécessaire de vérifier si une ligne est écrite, en tant que jeu n'autorise aucun doublure, vous pouvez simplement ajouter tout lignes à un ensemble, puis écrivez l'ensemble sur le fichier de sortie comme tel xxx

et, en outre, je croirais la manière la plus efficace serait xxx


2 commentaires

Vous devez utiliser la bibliothèque os pour concaténer les chemins, ne jamais concaténer les chemins manuellement ...


Parfait, ça fait exactement ce que je voulais. Merci.



0
votes

Vous devrez concaténer le chemin au nom du fichier afin de créer le chemin complet et de l'attribuer à une variable. Supposons que le nom du fichier est stocké dans la variable nom de fichier . Ainsi, le fichier peut être ouvert à l'aide de xxx

Vous devez appliquer la même lorsque vous ouvrez le fichier dans le mode w , n'oubliez pas que importer os Au début de votre script

Un commentaire supplémentaire sur votre code ... Vous ne devez pas continuer à accumuler le vu_lines car si vous avez beaucoup de lignes dans votre fichier, il sera besoin de beaucoup de mémoire ram. Au lieu de cela, calculez le hachage de chaque ligne et les accumulez dans un ensemble. Il sera également considérablement plus rapide que votre code actuel.

à résumer, j'utiliserais le code suivant: xxx


8 commentaires

Cela ne fonctionnerait clairement pas car vous exécutez le nom de fichier lors de l'ouverture pour la lecture et d'essayer de l'utiliser pour écrire, le reste du code souffre d'une inefficacité


@rotemtal Quelles sont les inefficacités que le code souffre?


Vous avez complètement raison. Corrigée. Merci. Pouvez-vous commenter la partie inefficacité? Il est beaucoup plus efficace que le code de l'auteur. Si vous avez quelque chose à dire pour le code de l'autre, veuillez fournir des arguments


Merci pour la modification, @ganeshtata. C'est un plaisir de travailler avec des utilisateurs comme vous: D


@GaneshTata Toute l'itération est inefficace, mais spécifiquement, le hachage est inutile, plus lorsque vous avez ajouté à un ensemble, il n'est pas nécessaire de vérifier si l'élément existe dans l'ensemble, car un ensemble ignore donc inefficace.


@ROTEMTAL qui n'est pas vrai, le hachage est nécessaire car il réduit beaucoup l'utilisation de la mémoire (à partir d'une chaîne à un INT64). La partie où je vérifie si l'élément est déjà dans l'ensemble est complètement nécessaire et non pour l'ajout du hachage à l'ensemble mais pour écrire la ligne dans le fichier. S'il vous plaît lorsque vous analysez le code des autres réfléchit deux fois avant de commenter.


Votre argument sur la mémoire est accepté et ce n'est toujours pas un moyen efficace d'effectuer cette tâche, et non la solution correcte d'utiliser le fichier Python définir


Je ne vois pas votre proposition efficace nulle part, @rotemtal



0
votes

Essayez de remplacer xxx

avec xxx


1 commentaires

Veuillez utiliser la bibliothèque os pour concaténer des chemins. Certains chemins contiendront un / à la fin, puis votre code échouera