2012-01-01 112 views
11

我已經開始學習Python與LPTHW,我已經得到了鍛鍊16:Python:如何在一行中寫入多個字符串?

http://learnpythonthehardway.org/book/ex16.html

,感覺像一個白癡,因爲我想不通看似簡單的「加分」的一個分配需要以下內容:

target.write(line1) 
target.write('\n') 
target.write(line2) 
target.write('\n') 
target.write(line3) 
target.write('\n') 

被壓縮爲一行代碼。我已經嘗試了一些如下:

target.write(line1 \n, line2 \n, line3 \n) 

或者:

target.write('line1 \n, line2 \n, line3 \n') 

或者:

target.write(%r \n, %r \n, %r \n) % (line1, line2, line3) 

我只是無法得到它改寫一號線,2號線,3號線和串在一起。我試過各種其他的組合,有和沒有逗號,引號等。我不斷收到各種錯誤,如無效語法或我有太多的參數。

任何幫助(及其背後的解釋)將不勝感激。謝謝!

回答

42
target.write(line1 \n, line2 \n, line3 \n) 

'\ n'只在字符串文字中有意義。沒有引號,你沒有字符串文字。

target.write('line1 \n, line2 \n, line3 \n') 

好吧,現在一切都是字符串文字。但是你想讓line1,line2,line3不是字符串文字。你需要那些作爲python表達式來引用有問題的變量。基本上,你必須在字符串附近加上引號,這些字符串實際上是「\ n」而不是變量的文本。如果你這樣做,你可能已經得到了類似:

target.write(line1 '\n' line2 '\n' line3 '\n') 

什麼是2 2?沒什麼。你必須指定python如何組合這兩個部分。所以你可以有2 + 22 * 22 2沒有任何意義。在這種情況下,我們使用添加到兩個字符串

target.write(line + '\n' + line2 + '\n' + line3 + '\n') 

上集成移動,

target.write(%r \n, %r \n, %r \n) % (line1, line2, line3) 

再次\n不僅使一個字符串裏的感覺。用於生成字符串的%運算符將字符串作爲其左側。所以你需要一個字符串中的所有格式化細節。

target.write('%r \n', '%r \n', '%r \n') % (line1, line2, line3) 

但是,這產生3個字符串文字,你只需要一個。如果你這樣做,寫抱怨,因爲它節選一個字符串,而不是3,所以,你可能已經嘗試過這樣的:

target.write('%r \n%r \n%r \n') % (line1, line2, line3) 

但你想寫的一號線,2號線,3號線到文件中。在這種情況下,您正在嘗試在寫入完成後進行格式化。當python執行此操作時,它將首先運行target.write:

None % (line1, line2, line3) 

這樣做什麼都不會有用。爲了解決這個問題,我們需要把%().write()

target.write('%r\n%r\n%r\n' % (line1, line2, line3)) 
+0

感謝您的全面解答。我真的不僅瞭解正確的答案,而且還了解錯誤的情況,以及這裏發生了什麼。謝謝! – jstacks 2012-01-01 01:30:22

+0

@jstacks,那麼我的任務就完成了! – 2012-01-01 01:32:19

5

你最後的嘗試看起來很有希望。它應該看起來像:

"%s \n %s \n %s" % (line1, line2, line3) 

適用運營商%爲一個字符串(3個%s佔位符)和值的元組來代替(這裏是字符串)。結果是格式化的字符串。

所以,你會需要包裝,在這需要結果的函數:

target.write("%s \n %s \n %s" % (line1, line2, line3)) 
+0

我真的不知道是否t o給你或'+'回答複選標記。但是,我從來沒有想過使用'+',但這是一個很好的學習課程。這裏的括號是另一個,我很欣賞那一個。當使用這種方法時,它似乎向我扔回引號......我該如何解決這個問題?因爲刪除它們會導致語法錯誤。 – jstacks 2012-01-01 01:16:14

+0

@jstacks,如果您需要語法錯誤幫助,請始終向我們展示代碼和語法錯誤。 – 2012-01-01 01:21:57

+0

引號是因爲我一直使用%r,使用%s修正......但是爲什麼?我知道''意味着它將專門針對一個字符串。但是不能更廣泛地工作,仍然會帶回字符串?爲什麼它不一樣?另外,使用此方法時,line2和line3會稍微縮進。爲什麼會發生這種情況,修復程序會是什麼? – jstacks 2012-01-01 01:24:19

4

這裏有一種方法:

target.write(line1 + '\n' + line2 + '\n' + line3 + '\n') 

以下原因不工作

target.write(line1 \n, line2 \n, line3 \n) 

line1是變量(注意它沒有被引用),但'\n'是一個字符串文字(因爲它在引號中)。加法運算符對字符串進行重載以連接(組合)它們。

的原因,這並不工作:

target.write('line1 \n, line2 \n, line3 \n') 

是因爲line1是一個變量。當你把它放在引號中時,它不再被視爲一個變量。

+0

我試過了(line1'\ n',第2行\ n',line3'\ n'),這也行不通(也試過用逗號間隔)。爲什麼+工作,但逗號沒有任何理由?我想它會將逗號之間的所有內容視爲自己的參數,而不僅僅是具有單獨變量的參數?那麼,+緩解呢? – jstacks 2012-01-01 01:12:44

+0

@jstacks在方法調用中的逗號是參數的分隔符,所以當它只有一個單獨的參數時,它會把它當作單獨的參數。 Python之間的空間是沒有意義的,所以這是一個錯誤。 '+'在操作順序中比函數評估具有更高的優先級,正如我上面提到的,字符串的加號是串聯。例如'print「hello」+「world」'與print「helloworld」'100%相同。或者對於數字「print 1 + 1」與「print 2」相同,因爲加號在打印之前發生。 – Davy8 2012-01-01 01:23:45

+0

謝謝你和溫斯頓發佈的內容,我肯定已經學會了一堆。 Stackoverflow真棒。 – jstacks 2012-01-01 01:31:54

2

下面一行對我的作品裏面,

target.write(line1 + line + line2 + line + line3 + line) 

在此之前,我增加

line = '\n' 

我的代碼,如:

from sys import argv 
script, filename = argv 
print 'Appending process starts on: %r' % filename 
target = open(filename, 'a') 
print 'Enter the contents:\t' 
line1 = raw_input('Next:\t') 
line2 = raw_input('Next:\t') 
line3 = raw_input('Next:\t') 
line = '\n' 
target.write(line1 + line + line2 + line + line3 + line) 
print 'Thank you !' 
相關問題