2011-09-30 7 views
1

J'écris un script python et j'ai juste besoin de la deuxième ligne d'une série de très petits fichiers texte. Je voudrais extraire ceci sans enregistrer le fichier sur mon disque dur comme je le fais actuellement.Télécharger un fichier en mémoire

J'ai trouvé quelques threads qui référencent les modules TempFile et StringIO mais je n'ai pas pu les comprendre.

Actuellement, je télécharge tous les fichiers et les nomme séquentiellement comme 1.txt, 2.txt, etc, puis parcourez chacun d'entre eux et extraire la deuxième ligne. Je voudrais ouvrir le fichier saisir la ligne puis passer à la recherche et l'ouverture et la lecture du fichier suivant.

Voici ce que je fais actuellement avec l'écriture à mon disque dur:

while (count4 <= num_files): 
    file_p = [directory,str(count4),'.txt'] 
    file_path = ''.join(file_p)   
    cand_summary = string.strip(linecache.getline(file_path, 2)) 
    linkFile = open('Summary.txt', 'a') 
    linkFile.write(cand_summary) 
    linkFile.write("\n") 
    count4 = count4 + 1 
    linkFile.close() 
+1

Je serais très intéressé par ce tutoriel/livre que vous utilisez pour apprendre Python afin que je puisse vous en recommander un autre. –

Répondre

0

Vous ouvrez et fermez le fichier de sortie dans chaque itération.

Pourquoi ne pas simplement faire

with open("Summary.txt", "w") as linkfile: 
    while (count4 <= num_files): 
     file_p = [directory,str(count4),'.txt'] 
     file_path = ''.join(file_p)   
     cand_summary = linecache.getline(file_path, 2).strip() # string module is deprecated 
     linkFile.write(cand_summary) 
     linkFile.write("\n") 
     count4 = count4 + 1 

En outre, linecache est probablement pas l'outil ici car il est optimisé pour la lecture de plusieurs lignes à partir du même fichier, pas la même ligne de fichiers multiples.

Au lieu de cela, mieux faire

with open(file_path, "r") as infile: 
    dummy = infile.readline() 
    cand_summary = infile.readline.strip() 

En outre, si vous laissez tomber la méthode strip(), vous ne devez pas ajouter de nouveau le \n, mais qui sait pourquoi vous avez que là-dedans. Peut-être que .lstrip() serait mieux?

Enfin, qu'en est-il du manuel en boucle? Pourquoi ne pas utiliser une boucle for? Enfin, après votre commentaire, je comprends que vous voulez mettre le résultat dans une liste au lieu d'un fichier. D'ACCORD.

Au total:

summary = [] 
for count in xrange(num_files): 
    file_p = [directory,str(count),'.txt'] # or count+1, if you start at 1 
    file_path = ''.join(file_p)   
    with open(file_path, "r") as infile: 
     dummy = infile.readline() 
     cand_summary = infile.readline().strip() 
     summary.append(cand_summary) 
+0

Je pense que la question est "comment puis-je maintenir le résumé en mémoire sans écrire à summary.txt" –

+1

Je dois admettre que je ne suis pas sûr du tout ce que la question est. Le titre est sur le "téléchargement", mais il n'y a aucun téléchargement dans le code ... –

+0

La partie téléchargement est dans une autre partie du script, mais David a raison, désolé de ne pas l'avoir mieux expliqué. Il y a un site qui propose un fichier à télécharger, je préfère ne pas avoir à télécharger le fichier puis l'ouvrir puis saisir la deuxième ligne, je voudrais savoir s'il y a un moyen plus direct. – jimstandard

0

le fichier il suffit de remplacer l'écriture avec un appel à append() sur une liste. Par exemple:

summary = [] 
while (count4 <= num_files): 
    file_p = [directory,str(count4),'.txt'] 
    file_path = ''.join(file_p)   
    cand_summary = string.strip(linecache.getline(file_path, 2)) 
    summary.append(cand_summary) 
    count4 = count4 + 1 

En outre, vous devez normalement écrire count += 1. En outre, il semble que count4 utilise l'indexation basée sur 1. Cela semble assez inhabituel pour Python.

+0

ou utilisez 'pour count4 dans la plage (1, num_files + 1)' au lieu de vous incrémenter! – agf

+0

@agf D'accord, mais je ne peux pas être sûr à 100% que count4 va de 1. –

Questions connexes