2014-02-27 31 views
2

按照我之前的問題:ValueError: unsupported format character ',我有另一個問題。希望值得的SO。如何使用循環python將多個字符串解析爲字符串變量

下面是應該給你什麼,我想做一個味代碼:

import argparse 
title = 'Title' 
content='\centerline{\Large %(title)s}' 

parser=argparse.ArgumentParser() 

parser.add_argument('--title', default=title) 

for i in range(0,4): 
    number = str(2456*i) 
    content = content + ''' 
    %(number)s''' 

parser.add_argument('--number', default=number) 

content = content + ''' 
\end{document}''' 



args=parser.parse_args() 
content%args.__dict__ 
print content%args.__dict__ 
print ' ' 

print args.__dict__ 

它提供了以下的輸出:

\centerline{\Large Title} 
    7368 
    7368 
    7368 
    7368 
\end{document} 

{'number': '7368', 'title': 'Title'} 

它的工作原理,但數字都是相同。我最終想做的就是將其他地方生成的數字放在變量中。用python自動生成一個乳膠表。

這是最新的嘗試。這是相當醜陋..

import argparse 
title = 'Title' 
content='\centerline{\Large %(title)s}' 
number_dict = dict() 
for i in range(0,4): 
    number_dict[i] = str(2456*i) 
    content = content + ''' 

    %(number_dict[i])s''' 
    content = content + ''' 

    \end{document}''' 

parser=argparse.ArgumentParser() 

parser.add_argument('--title', default=title) 
parser.add_argument('--' + number_dict[i], default=number_dict[i]) 

args=parser.parse_args() 
content%args.__dict__ 
print content%args.__dict__ 
print ' ' 

print args.__dict__ 

任何想法?

編輯:

1)我相信我已經解決了這個問題,就目前而言,看到的第一個評論。但問題仍然很有趣。

2)此代碼不適用於命令行。

3)我想用它來輸入表格的條目。可能有很多條目,所以我不想按照在ValueError: unsupported format character '和參考問題中所做的方式對每行數據進行硬編碼以包含在latex文檔中。

這樣說吧:在工作上面代碼中,語法:

%(number)s 

連同:

parser.add_argument('--number', default=number) 

是用來放置字符串「號」到乳膠代碼。我想在一個循環中實現這一點,以便我可以首先將string1放入latex代碼,然後是string2,然後是string3,等等,就像我一樣。可能是20個不同的字符串,可能是35,可能是4.可以將所有這些不同的字符串放在乳膠代碼中(比如在表格的每個單元格中),只有一個等同於代碼段的實例:%數字)s,以及一個等同於代碼段的實例:parser.add_argument(' - number',default = number)在循環中?

你可以看到我試圖通過重新定義「number」作爲一個字典,並告訴python插入字典的哪個條目。

我希望更清楚。

+0

替代解決方案我只是想到了..將所有數字存儲在一個大型變量中,然後將其插入到乳膠中。 – juggler

+0

鑑於代碼沒有做你想做的事情;你能描述一下你想用簡單的英語來做什麼(你的輸入是什麼,相應的輸出是什麼)? – jfs

+0

您是否期望您的用戶輸入如下內容:'python foo.py --title xxx --2456 something --4912 else'?在最終的「內容」中,「某物」將取代默認值「2456」? – hpaulj

回答

1

的問題是,你正在建立在循環的格式字符串,這給一些使用同一個變量多次:

''' 
%(number)s 
%(number)s 
''' 

循環後,變量number有最後的值,因爲Python變量一次只能有一個值!解決方法是做格式化的循環,當你有可用的每個值:

for i in range(0,4): 
    number = str(2456*i) 
    content = content + ''' 
    %(number)s''' % {'number': number} 

編輯追加由運算所需的詳細信息:

有上string formatting在Python文檔的部分。它解釋了兩個使用命名項格式的詞典形式,以及簡單的形式,看起來像這樣:

for i in range(0,4): 
    content += '\n %d' % (2456*i) 

在第一種情況下,格式串擴展通過查看dict%(....)s內指定的名稱。在第二種情況下,只有一個值和一個格式項,所以Python沒有問題知道要替換哪個值。如果格式字符串有多個%,則第二個參數應該是一個元組,並且元組的元素用於依次擴大每個%。最後,%d(用於「數字」)將一個數字變成一個字符串,因此您不需要自己撥打str()

您的原始代碼每次打印相同數字的原因是您只在最後插入數字,而不是替換循環中每次計算的連續值。

+0

我得到了所有的興奮..但我得到這個錯誤消息:'追蹤(最近呼叫最後): 文件「SO_answer.py」,第12行,在 %(數字)s'''%編號 TypeError :格式需要映射' – juggler

+0

可以簡化爲:'爲我在範圍內(0,4):content + ='\ n%s'(2456 * i)' – hpaulj

+0

@hpaulj - 對於我在範圍內(0,4):content + ='\ n%d'%(2456 * i)' –

0

這是一個瘋狂的猜測,但我認爲你的'''應該是'\'',否則第二個'關閉第一個,第三個掛起不成對。

content = content + '\'' 
%(number_dict[i])s'\'' 
content = content + '\'' 
\end{document}'\'' 
+0

在Python 3引號標記一個多行文本塊。但是有時候,如果你使用「一行\ n第二行\ n第三」,就會更清楚。 – hpaulj