2011-01-15 5 views
0

Je fichier délimité par des tabulations comme celui-ciComment ouvrir un grand nombre de fichiers avec for loop?

balise1 DONNÉES
tag20 DONNÉES
TAG4 DONNÉES
tag3 DONNÉES
tag10 DONNÉES

Ces données ont autour de 250000 lignes. Je veux trier ces lignes dans le fichier par étiquette. La ligne commence par tag1 va dans tag1.txt. La ligne commence par tag2 goto tag2.txt ... etc.

Y a-t-il une façon intelligente de faire cela avec une boucle?

+0

De quelle façon avez-vous essayé? – soulseekah

+0

J'ai essayé d'ouvrir chaque fichier manuellement et d'utiliser beaucoup de si ... Un peu de brainfart m'a eu je suppose. EDIT: Je reviens à lire mon code à nouveau, je pense que c'est à peu près équivalent à quelque chose sur dailywtf .... –

Répondre

2
import collections 

file_data = collections.defaultdict(list) 

with open("you_file") as f 
    for line in file: 
     tag, data = line.split('\t', 1) 
     file_data[tag].append(data) 

for file_name, data in file_data.items(): 
    with open(file_name, 'w') as f: 
     f.write("\n".join(data)) 
1

Cela a pris 5 secondes pour un fichier d'entrée de 200 000 lignes.

with open("input.txt") as f: 
    for line in f: 
     tag_fname, tag_data = line.split(' ',1) 
     with open(tag_fname, 'a') as g: 
      g.write(tag_data) 
+0

vous savez que ce code fera 200000 opérations d'E/S (ouverture et fermeture de fichier) qui sont très coûteux en terme de ressource !!! – mouad

+0

... lol? S'il y a 200 000 fichiers à écrire, il n'y a pas moyen d'ouvrir et de fermer 200 000 fichiers. –

+0

Oui, je le sais. C'est pourquoi j'ai mentionné que cela a pris 5 secondes. Je ne pense pas que ce soit une bonne idée, mais sert le but pour des opérations ponctuelles. Tout en faisant beaucoup d'opérations d'E/S, ce code ne garde pas beaucoup de données en mémoire ce qui peut poser problème en fonction de DATA en question et du nombre de tags différents. – dheerosaur