2015-06-24 23 views
0

我是一個python noob,所以請對我輕鬆一點。在Python中打印一個帶有字符串和插入變量的隨機csv單元格2

我有一個例子csv文件(實際的CSV文件有20行2列類似於如下圖所示):

"I hate %s" % x, "I am a %s" % x 
"I heart %s" % x, "I am not a %s" % x 

我的Python 2.7腳本:

from csv import * 

x = "gorillas" 

with open('csv_test.csv', 'rU') as csvfile: 
    spamreader = reader(csvfile, quoting = QUOTE_MINIMAL) 
    list = [] 
    for row in spamreader: 
     list.append(row[0]) 

    print list[1] 

csvfile.close() 

我想我的腳本進行打印:

I heart gorillas 

取而代之的則是打印:

"I heart %s" % x 

所以,我的變量x沒有被插入到我的字符串中。我假設我的問題是,當我從我的csv中提取單元格的內容時,整個單元格內容被視爲一個字符串。但是,我不知道如何解決這個問題。

作爲獎勵或後續,我也想從我的csv文件中選擇一個隨機單元格。

感謝您的幫助。

回答

1

一種選擇是讓csv文件被解釋爲一個字符串格式的代碼行。 這將要求您將字符串解釋爲腳本的一部分。 爲此,您可以用的eval()

print eval(list[1]) 

應該做到這一點。

根據您的應用程序,eval可能很有用,但通常我會而不是建議從某處讀取輸入,然後使用eval運行內容。 考慮用戶在網站上發佈文本的思想實驗。 如果帖子包含有效的python代碼,他們剛剛獲得了在您的機器上運行自己的腳本的權限。

相反,您可以替換部分字符串。 和再鬆「%X」格式說明

from csv import * 

x = "gorillas" 

with open('csv_test.csv', 'rU') as csvfile: 
    spamreader = reader(csvfile, quoting = QUOTE_MINIMAL) 
    list = [] 
    for row in spamreader: 
     list.append(row[0]) 

    print list[1].replace("%s", x) 

csvfile.close() 
+0

我從所有答案中看到,當我使用腳本打印單元格的內容時,一種解決方案是使用eval()。當我運行這個時,這很好用。我認爲這對我來說是一個很好的解決方案,因爲我的最終用途,但我會讓你的專家成爲法官。我的腳本基本上只是較大遊戲腳本的一小部分(僅供個人使用),我的腳本將從我的csv文件訪問隨機單元以供給用戶/玩家。我不打算分享我的腳本或我的csv文件。希望我能以這種方式使用eval。 –

+0

哦,看起來像.replace()也適用於我。我擔心它不起作用,因爲我的csv文件中有一些單元格是格式說明符(%x)的字符串,但某些單元格只是沒有格式說明符的直線字符串。但是,.replace()似乎對沒有格式說明符的單元格沒有影響。我想這是對我的問題更好的解決方案。 –

+0

忘了說感謝Henrik! –

1

你能做到這一點使用eval:

from csv import * 

x = "gorillas" 

with open('csv_test.csv', 'rU') as csvfile: 
    spamreader = reader(csvfile, quoting = QUOTE_MINIMAL) 
    list = [] 
    for row in spamreader: 
     list.append(eval(row[0])) 

    print list[1] 

csvfile.close() 
+2

'eval()'是危險的,應該___不能用於不可信的數據。 –

+0

謝謝薩欽。 eval()確實有效,對我的情況可能會好,但我認爲.replace()是其他人指出的更安全的實現。 –

0

有運行代碼,當我看到兩個問題 -

  1. 您沒有設置引用到QUOTE_NONEreader這將導致csv讀取器不能替換雙引號(至少它不在我的機器中),QUOTE_MINIMAL(在我的機器中,python 3.4和python 2.7)它取代了雙引號,並且在list中沒有雙引號。

  2. 打印字符串時,必須評估表達式並使用eval()函數打印它。

的代碼看起來是這樣的 -

>>> with open('csv_test.csv', 'rU') as csvfile: 
...  spamreader = reader(csvfile, quoting = QUOTE_NONE) 
...  list = [] 
...  for row in spamreader: 
...   list.append(row[0]) 
... 
>>> print(eval(list[1])) 
I heart gorillas 

我只是用|,因爲它不會在您的CSV例子發生,你可以用任何東西。

請注意,將這些陳述保留在csv中,然後使用eval在函數中對它們進行評估是不好的做法,因爲它們可以將任何內容寫入csv,並且可能會導致程序出現潛在問題。

+0

謝謝阿南德。 eval()確實有效,對我的情況可能會好,但我認爲.replace()是其他人指出的更安全的實現。另外,quoting = QUOTE_NONE在我的字符串周圍添加額外的「」。我在嘗試QUOTE_MINIMAL之前嘗試了這一點。 –

相關問題