2010-01-19 28 views
0

我剛剛通過表單上傳了這個CSV文件,並將其發佈到我的Python CGI腳本中。上傳似乎已成功完成。該文件夾的權限是777,該文件是755TypeError僅僅用csv.DictReader打開一個文件?

>>> import csv 
>>> csvHandle = open('files/TestData.csv', "rb") 
>>> csvRawRecordDicts = csv.DictReader(csvHandle) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
TypeError: __init__() takes at least 3 arguments (2 given) 

的值如下:

csvRawRecordDicts undefined, 
csv = <module 'csv' from '/usr/lib/python2.3/csv.pyc'>, 
csv.DictReader = <class csv.DictReader>, 
csvHandle = <open file 'files/TestData.csv', mode 'rb'> 

的代碼工作正常,我的本地計算機上使用Python 2.5。錯誤發生在2.3。

調試類似這樣的思考過程是什麼?我從哪裏開始尋找?

+0

CSV文件是下面的文本;你應該使用「r」的模式。 – 2010-01-19 20:02:55

+1

@Ignacio:** UTTERLY WRONG ** csv.reader和csv.writer(Python 2.3到2.6)的文檔說「」「如果csvfile是一個文件對象,它必須在平臺上用'b'標誌打開有所作爲。「」「。如果csvfile是一個文件對象,它必須在平臺上用'b'標誌打開,這對於便攜性來說,無條件地用'b'打開。此外,OP在* x平臺上,'b'標誌被忽略。 – 2010-01-19 21:38:45

+0

@約翰:夠公平的。 – 2010-01-19 21:41:55

回答

1

有一對夫婦的事情你可以做:

  • 閱讀relevant docs,看到DictReader至少需要兩個參數,而你傳遞一個
  • 嘗試做>>> help(csv.DictReader)和到達相同的結論。

由於文檔閱讀可以解釋的第二個參數應該是fieldnames(我推測名單就足夠了),更重要的這些信息轉達錯誤消息!

+1

我明白了,在閱讀http://docs.python.org/library/csv.html#csv.DictReader之後,我最初在Python 2.5上開發了代碼,其中說'fieldnames'是可選的。我發現它在2.3中不是可選的!還要感謝help()提示。 – Pranab 2010-01-19 20:01:58

1

所有的什麼無聲鬼說,加:

重點的變化:在我看來,最重要的一點是要仔細閱讀錯誤消息。在這種情況下,它簡單明瞭地告訴你,你需要提供另一個論點。檢查幫助(或者您正在運行的Python版本的文檔)如下所示...

另一點:確保您瞭解代碼正在執行的操作。 csv.DictReader()不打開文件。文件系統權限不相關 - 您已經打開文件並將句柄傳遞給csv.DictReader()。

+0

我在教自己的Python,並沒有立即意識到哪裏(或爲什麼)任何類型的__init __()進入整個事情..我會期望它明白地說csv.DictReader()需要三個參數。更多的困惑,因爲它在2.5我的本地計算機上運行良好 - 與我遇到的所有其他問題一樣,我開始相信將腳本從PHP5移植到PHP4比從Python2.5移植到2.3更簡單。 – Pranab 2010-01-20 07:19:09