2010-08-24 5 views
3

J'ai un très gros fichier texte (~ 8 gb) avec de très longues lignes. Je voudrais tirer des lignes dans des plages sélectionnées de ce fichier et les mettre dans un autre fichier texte. En fait, ma question est très similaire à this et this mais je reste coincé quand j'essaie de sélectionner une gamme de lignes au lieu d'une seule ligne.Sélection et impression de lignes spécifiques de fichier texte

Jusqu'à présent, c'est la seule approche que j'ai appris à travailler:

lines = readin.readlines() 
out1.write(str(lines[5:67])) 
out2.write(str(lines[89:111])) 

Cependant, cela me donne une liste et je voudrais produire un fichier avec un format identique au fichier d'entrée (une ligne par rangée)

Répondre

4

Vous pouvez appeler jointure sur les plages.

lines = readin.readlines() 
out1.write(''.join(lines[5:67])) 
out2.write(''.join(lines[89:111])) 
+1

Il devrait être out1.write (''. Join (lignes [5:67])) et même pour out2 car readlines ne supprime pas la fin des lignes –

+0

@Xavier oops, fixed – Bob

+1

Ceci ne devrait pas être la réponse acceptée - vous ne lisez pas seulement 8 Go en mémoire, sauf si vous avez une très bonne raison de le faire. –

0

(Réponse partielle) Pour que votre approche actuelle fonctionne, vous devrez écrire ligne par ligne. Par exemple:

lines = readin.readlines() 

for each in lines[5:67]: 
    out1.write(each) 

for each in lines[89:111]: 
    out2.write(each) 
2

Puis-je vous suggérer de ne pas stocker le fichier entier (puisqu'il est grand) selon l'un de vos liens?

f = open('file') 
n = open('newfile', 'w') 
for i, text in enumerate(f): 
    if i > 4 and i < 68: 
     n.write(text) 
    elif i > 88 and i < 112: 
     n.write(text) 
    else: 
     pass 

Je vous recommande également d'utiliser « avec » au lieu d'ouvrir et de fermer le dossier, mais malheureusement je ne suis pas autorisé à passer à une nouvelle version de python assez pour cela ici. (

0
path = "c:\\someplace\\" 

fichiers ouverts 2 texte. une pour la lecture et l'écriture pour un

f_in = open(path + "temp.txt", 'r') 
f_out = open(path + output_name, 'w') 

passent par chaque ligne du fichier d'entrée

for line in f_in: 
    if i_want_to_write_this_line == True: 
     f_out.write(line) 

fermer est d'éviter de lire le fichier en mémoire à la fois les fichiers lorsque vous avez terminé

f_in.close() 
f_out.close() 
1

La première chose que vous devriez penser face à un problème comme celui-ci,. readlines() fera cela, de sorte que la méthode spécifique devrait être évitée.

Heureusement, nous avons une excellente bibliothèque standard en Python, itertools. itertools a beaucoup de fonctions utiles, et l'un d'eux est islice. islice itère sur un iterable (telles que des listes, des générateurs, objets de fichier de type etc.) et renvoie un générateur contenant la gamme spécifiée:

itertools.islice(iterable, start, stop[, step])

Faire un itérateur qui retourne des éléments sélectionnés de la itérable. Si start est différent de zéro, , les éléments de l'itérable sont ignorés jusqu'à ce que le début soit atteint. Par la suite, les éléments sont renvoyés consécutivement, sauf si l'étape est supérieure à celle qui entraîne l'omission d'éléments. Si l'arrêt est Aucun, alors l'itération se poursuit jusqu'à ce que l'itérateur soit épuisé, voire pas du tout; sinon, il s'arrête à la position spécifiée.Contrairement au découpage régulier, islice() ne prend pas en charge les valeurs négatives pour le démarrage, l'arrêt ou l'étape. Peut être utilisé pour extraire les champs connexes à partir des données où la structure interne a été aplaties (par exemple, un rapport sur plusieurs lignes peut liste un champ de nom sur chaque troisième ligne)

En utilisant cette information, avec la méthode str.join, vous pouvez par exemple extrait les lignes 10-19 en utilisant ce code simple:

from itertools import islice 

# Add the 'wb' flag if you use Windows 
with open('huge_data_file.txt', 'wb') as data_file: 
    txt = '\n'.join(islice(data_file, 10, 20)) 

Notez que lors de la boucle sur l'objet de fichier, la nouvelle ligne omble chevalier est dépouillé des lignes, de sorte que vous devez définir \ n que la jonction omble chevalier.

Questions connexes