2009-06-16 4 views
2

Je ne suis pas particulièrement expérimenté avec python, donc peut-être faire quelque chose de stupide ci-dessous. J'ai le programme suivant:Pourquoi y a-t-il des lignes vides supplémentaires dans ma sortie du programme python?

import os 
import re 
import linecache 

LINENUMBER = 2 

angles_file = open("d:/UserData/Robin Wilson/AlteredData/ncaveo/16-June/scan1_high/000/angles.txt") 

lines = angles_file.readlines() 

for line in lines: 
    splitted_line = line.split(";") 
    DN = float(linecache.getline(splitted_line[0], LINENUMBER)) 
    Zenith = splitted_line[2] 
    output_file = open("d:/UserData/Robin Wilson/AlteredData/ncaveo/16-June/scan1_high/000/DNandZenith.txt", "a") 
    output_file.write("0\t" + str(DN) + "\t" + Zenith + "\n") 
    #print >> output_file, str(DN) + "\t" + Zenith 
    #print DN, Zenith 

output_file.close() 

Quand je regarde la sortie vers le fichier que je reçois le texte suivant:

0 105.5  0.0 

0 104.125 18.0 

0 104.0 36.0 

0 104.625 54.0 

0 104.25 72.0 

0 104.0 90.0 

0 104.75 108.0 

0 104.125 126.0 

0 104.875 144.0 

0 104.375 162.0 

0 104.125 180.0 

Quel est le bon nombre, il a simplement des lignes vides entre chaque ligne. J'ai essayé et essayé de les enlever, mais je ne peux pas sembler. Qu'est-ce que je fais mal?

Robin

+0

Quelqu'un S'IL VOUS PLAÎT enlever l'étiquette « readline » de cette question. Le problème du questionneur n'est pas spécifique à la méthode readline des objets du fichier Python [que le questionneur n'utilise pas quand même; il utilise readlines] et n'a aucun lien avec la fonction readline de lecture de consoles * x (qui semble être le sujet de presque toutes les autres questions marquées «readline»). –

Répondre

15

Pour une solution générale, retirer la nouvelle ligne de fuite de votre INPUT:

splitted_line = line.rstrip("\n").split(";") 

Retrait de la nouvelle ligne étrangère de votre sortie " fonctionne "dans ce cas mais c'est un kludge.

AUSSI: (1) ce n'est pas une bonne idée d'ouvrir votre fichier de sortie au milieu d'une boucle; faites-le une fois, sinon vous ne faites que gaspiller des ressources. Avec une boucle assez longue, vous manquerez de poignées de fichiers et de crash (2) Ce n'est pas une bonne idée de câbler des noms de fichiers comme ça, surtout cachés au milieu de votre script; essayez de rendre vos scripts réutilisables.

+1

pourquoi est-ce un kludge? il prend une chaîne, travaille avec son début et utilise le reste pour la sortie. Qu'est-ce qui ne va pas avec ça? – SilentGhost

+0

Je ne sais pas pourquoi vous voudriez supprimer un caractère que vous avez l'intention d'ajouter à la sortie de toute façon. –

+4

Parce que le saut de ligne n'appartient pas à l'élément de données qu'il a pris la peine de donner un nom supposé significatif (Zenith). Ce n'est qu'une coïncidence que c'est "le reste". Prochain épisode: la sortie n'est pas un fichier texte, il est inséré dans une colonne de base de données, et quelqu'un est de retour ici pour demander le saut de ligne au milieu d'une ligne dans le fichier CSV qu'ils ont récupéré de leur requête. –

8

Modifier ceci:

output_file.write("0\t" + str(DN) + "\t" + Zenith + "\n") 

à ceci:

output_file.write("0\t" + str(DN) + "\t" + Zenith) 

La chaîne Zenith contient déjà le \n arrière à partir du fichier d'origine lorsque vous l'avez lu dans

2
.

Solution alternative (ha ndy si vous traitez des lignes à partir du fichier) est de dépouiller les espaces blancs:

Zenith = Zenith.strip(); 
+0

Un autre kludge. Si vous êtes intéressé par tout sauf le saut de ligne, faites line = line.rstrip ('\ n') sinon, si vous voulez supprimer les espaces, faites-le depuis TOUS les champs: splitted_line = [x.strip() pour x in line .split (';')] –

1

Si vous voulez vous assurer qu'il n'y a pas d'espace sur vos jetons (et pas seulement le premier et le dernier), essayez ceci:

splitted_line = map (str.strip, line.split (';')) 
2

EDIT: Voir les commentaires pour plus de détails, mais il y a certainement un meilleure façon. [:-1] n'est pas le meilleur choix, peu importe à quel point il semble cool. Utilisez line.rstrip('\n') à la place.

Le problème est que, contrairement à file_text.split('\n'), file.readlines() ne supprime pas la \n de la fin de chaque ligne d'entrée. Mon modèle par défaut pour l'analyse syntaxique des lignes de texte va comme ceci:

with open(filename) as f: 
    for line in f.readlines(): 
     parse_line(line[:-1]) # funny face trims the '\n' 
+2

Ohhh et la troisième chose que l'OP fait mal utilise readlines. Il devrait faire "pour la ligne dans angles_file:". Et vous ne devriez pas utiliser de grimaces; il est tout à fait possible que la dernière ligne ne soit pas terminée par une nouvelle ligne et votre drôle de tête va croquer le dernier caractère. Utilisez .rstrip ('\ n') qui perd le retour à la ligne SI TOUT. –

+0

Autant que j'aime l'idée de la grimace grimace sur le dernier personnage non-n, j'avoue ... c'est un mauvais comportement. ;) Bon point sur les readlines() par rapport à la ligne dans le fichier. – ojrac

Questions connexes