2011-02-03 7 views
2

J'ai un objet StringIO rempli correctement. J'ai que le code suivant:Affectation de chaînes python

val = log_fp.getvalue() 
lines = val.split('\n') 
newval = '' 
for line in lines: 
    if (not line.startswith('[output]')): 
     newval = line 
     print 'test1'+newval  
print 'test2' +newval 

dans la boucle, je la valeur correcte pour newval imprimé, mais dans la dernière impression, j'ai une chaîne vide. Des idées de ce que je fais mal? Ce dont j'ai besoin est d'extraire l'une des lignes de l'objet stringIO marqué [output], mais newval semble être vide dans 'test2'.

+0

Avez-vous essayé d'ajouter des guillemets simples autour de 'newval'? De cette façon, vous pourriez voir si python imprime un caractère de nouvelle ligne. – Davidann

+0

@David, le split() ne doit pas inclure les caractères de nouvelle ligne dans les éléments des lignes – winwaed

+0

Voulez-vous extraire une seule ligne marquée '[sortie]' ou toutes les lignes marquées comme telles? – kevpie

Répondre

0

Log_fp est-il un fichier texte? Si c'est le cas, la dernière valeur en lignes sera tout ce qui suit le dernier caractère de retour à la ligne. Votre fichier se termine probablement par un saut de ligne, un saut de ligne et des espaces. Dans le premier cas, la dernière valeur de la ligne sera une chaîne vide. Dans ce dernier cas, la dernière valeur de ligne sera l'espace. Pour éviter cela, vous pouvez ajouter une nouvelle clause à l'instruction if pour vérifier que la chaîne tronquée n'est pas vide, par exemple.

val = log_fp.getvalue() 
lines = val.split('\n') 
newval = '' 
for line in lines: 
    if (len(line.strip()) > 0): 
     if (not line.startswith('[output]')): 
      newval = line 
      print 'test1'+newval  
print 'test2' +newval 

(je ne l'ai pas essayé de courir, mais il devrait vous donner l'idée)

+0

pourquoi est-ce important? OP devrait obtenir ''test1' 'comme dernière sortie de test1. c'est tout. Il est toujours là, non? – SilentGhost

+1

La sortie test1 donnera la dernière ligne qui ne commence pas par [sortie] - dans son exemple, cela pourrait être une chaîne vide pour le cas où le fichier se termine par un retour à la ligne. – winwaed

4

Fractionnement sur « \ n » pour une chaîne telle que 'foo\n' produira ['foo', ''].

+0

semble être le problème, 'lines = val.splitlines()' le corrigera. –

+0

encore une fois, cela pourrait être la raison, mais la sortie aura une ligne 'test1'. n'est-ce pas? – SilentGhost

+1

La logique «non» est problématique. Il écrase newval avec tout ce qui ne commence pas par '[output]'. Nous ne savons pas non plus si les lignes ont des espaces de début ''[sortie]''. Fournir un échantillon d'entrée/sortie aide toujours avec ce type de question. Le conseil de @ Jochen modifierait aussi le comportement sur l'espace principal (pour le mieux). – kevpie

1

Ce que je besoin est d'extraire l'une des lignes dans l'objet StringIO qui est marqué [sortie],

Untested:

content = log_fp.getvalue().split() 
output_lines = [x for x in content if x.startswith('[output'])] 

obtenir ensuite le premier élément de output_lines, si c'est ce dont vous avez besoin.