2011-02-03 43 views
2

StringIOオブジェクトが正しく埋められています。次のコードを持っているよりもI:ループ内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 

は、私が印刷されたnewvalに正しい値を持っていますが、最後の印刷では、私は空の文字列を持っています。私が間違っていることは何ですか?私が必要とするのは、[出力]とマークされたstringIOオブジェクトの行の1つを抽出することですが、newvalは 'test2'では空のようです。

+0

'newval'の前後に一重引用符を追加しようとしましたか?そうすれば、Pythonが改行文字を出力しているかどうかを知ることができます。 – Davidann

+0

@David split()は、行番号 – winwaed

+0

の要素に改行文字を含めないでください。 '[output]'とマークされた1行だけを抽出しますか? – kevpie

答えて

0

log_fpはテキストファイルですか? もしそうなら、行の最後の値は最後の改行文字の後のすべての値になります。あなたのファイルは、おそらく改行や改行や空白で終了するでしょう。 前者の場合、行の最後の値は空の文字列になります。 後者の場合、行の最後の値は空白になります。

これを避けるには、if文に新しい節を追加して、トリムされた文字列が空でないことを確認します。

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 

(私はこれを実行しようとしていないが、それはあなたのアイデアを与える必要があります)など'foo\n'として文字列のためには「\ n」の上

+0

なぜそれは重要ですか? OPはtest1出力の最後に '' test1''を得なければなりません。それで全部です。それはまだそこにありますか? – SilentGhost

+1

test1出力は、[出力]で始まらない最後の行を与えます - この例では、ファイルが改行で終わる場合の空の文字列になる可能性があります。 – winwaed

4

分割が['foo', '']が生成されます。私は必要なもの

+0

が問題のように聞こえる場合は、 'lines = val.splitlines()'がそれを修正します。 –

+0

再び、それは理由かもしれませんが、出力に 'test1'という行があります。それじゃない? – SilentGhost

+1

'not'ロジックに問題があります。 newvalは '[出力]'で始まらないもので上書きされます。また、 '' [出力] ''の空白が先頭にあるかどうかもわかりません。サンプル入出力を提供することは、この種の質問に常に役立ちます。 @ Jochenの助言は、先頭のスペースの振る舞いも変えてしまうでしょう。 – kevpie

1

未テスト がマークされてStringIOオブジェクト[出力]で ラインの一つ、

を抽出することである。

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

その後の最初の要素を取得output_lines、それが必要ならば。

関連する問題