2010-01-19 31 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