【问题标题】:TypeError upon merely opening a file with csv.DictReader?仅使用 csv.DictReader 打开文件时出现 TypeError?
【发布时间】:2010-01-19 19:35:04
【问题描述】:

我刚刚通过表单上传了这个 CSV 文件,并将其发布到我的 Python CGI 脚本。上传似乎已成功完成。文件夹的权限是777,文件的权限是755。

>>> 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。

调试这样的事情的思考过程是什么?我从哪里开始寻找?

【问题讨论】:

  • CSV 文件是下面的文本;你应该使用'r'的模式。
  • @Ignacio: 完全错误 csv.reader 和 csv.writer(Python 2.3 到 2.6)的文档说“”“如果 csvfile 是文件对象,则必须打开它在有区别的平台上使用“b”标志。“””。最好将其表示为“”“如果 csvfile 是一个文件对象,则它必须在有区别的平台上使用 'b' 标志打开。为了可移植性,无条件使用 'b' 打开”“”。此外,OP 位于 *x 平台上,其中“b”标志被忽略。

标签: python csv


【解决方案1】:

你可以做几件事:

  • 阅读relevant docs 并看到DictReader 至少需要两个参数,而您要传递一个参数
  • 尝试做&gt;&gt;&gt; help(csv.DictReader) 并得出相同的结论。

阅读文档可能会解释第二个参数应该是 fieldnames(我认为列表就足够了),重要的是,此信息已在错误消息中传达!

【讨论】:

【解决方案2】:

所有寂静鬼所说的,加上:

重点的改变:在我看来,最重要的一点是仔细阅读错误信息。在这种情况下,它简单明了地告诉您需要提供另一个参数。检查帮助(或您正在运行的 Python 版本的文档)如下...

另一点:确保您了解您的代码在做什么。 csv.DictReader() 不会打开文件。文件系统权限不相关——您已经打开文件并将句柄传递给 csv.DictReader()。

【讨论】:

  • 我正在自学 Python,并没有立即意识到任何类型的 __init__() 出现在哪里(或为什么)。 () 需要三个参数。更多的混乱,因为它在我的本地计算机上的 2.5 上运行良好 - 由于我遇到的所有其他问题,我开始相信将脚本从 PHP5 移植到 PHP4 比从 Python 2.5 移植到 2.3 更简单......
猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
相关资源
最近更新 更多