Python 是否添加到现有电子表格?
我有一个带有字段名的电子表格: [‘姓名’、‘职业’、‘公司’、‘地址’、‘城市’、‘州’、‘邮政编码’、‘电话’、‘传真’、‘电子邮件’、‘网站’、‘描述’] 并希望在此电子表格中添加包含较少字段名的其他数据电子表格(尽管其他所有字段名都包含在此电子表格中) 我得到了一个奇怪的错误:Python 是否添加到现有电子表格?,python,csv,Python,Csv,我有一个带有字段名的电子表格: [‘姓名’、‘职业’、‘公司’、‘地址’、‘城市’、‘州’、‘邮政编码’、‘电话’、‘传真’、‘电子邮件’、‘网站’、‘描述’] 并希望在此电子表格中添加包含较少字段名的其他数据电子表格(尽管其他所有字段名都包含在此电子表格中) 我得到了一个奇怪的错误: Samuel-Finegolds-MacBook-Pro:~ samuelfinegold$ /var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup\ A
Samuel-Finegolds-MacBook-Pro:~ samuelfinegold$ /var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup\ At\ Startup/merge-395698810.980.py.command ; exit;
['name', 'occupation', 'company', 'address', 'address_2', 'city', 'state', 'zip', 'phone,fax', 'email', 'website', 'description']
Traceback (most recent call last):
File "/Users/samuelfinegold/Documents/noodle/merge.py", line 14, in <module>
gc_all_dict.writerow(row)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 148, in writerow
return self.writer.writerow(self._dict_to_list(rowdict))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 144, in _dict_to_list
", ".join(wrong_fields))
TypeError: sequence item 0: expected string, NoneType found
logout
[Process completed]
伪造数据:
name occupation company address address_2 city state zip phone fax email website description
Rob Er Step Up 123 Road Dr New York NY 10011 1234567891 1234567891 a@b.com www.stepUp.com A great counselor
Bob B. Bob For Your Rights 12 2nd Ave San Francisco CA 94109 1234567891 1234567891 c@d.com
Snob Job Marley Inc. 12 1st Ave Denver CO 80231 1234567891 1234567891 g@h.com What a counselor!
这里真正的问题是,尽管您在问题中声明了什么,但其他所有字段名都不包括在该电子表格中 您可以通过查看升起的线上方的线来判断。看起来像这样:
def _dict_to_list(self, rowdict):
if self.extrasaction == "raise":
wrong_fields = [k for k in rowdict if k not in self.fieldnames]
if wrong_fields:
raise ValueError("dict contains fields not in fieldnames: " +
", ".join(wrong_fields))
return [rowdict.get(key, self.restval) for key in self.fieldnames]
因此,它找到了一个不在DictWriter
中的字段
但是,为什么它在试图创建错误的同时却提出了这个奇怪的错误呢?因为缺少的字段名为
None
。DictWriter
代码不是用来处理这个问题的。这就是问题2
为什么字段名为
None
?因为这就是DictReader
在发现一列不符合您提供的字段名
时产生的结果。您可以通过打印行看到这一点:dict
的一个元素类似于None:'foo'
。这就是问题3
那么你如何解决这个问题呢
很明显,要做的事情是让你的声明成为现实:让目标中的字段成为源中字段的严格超集
或者,您可以告诉您的DictReader
跳过额外的字段,或者告诉您的DictWriter
忽略这些字段而不是提升。例如,只需将extracation='ignore'
添加到DictWriter
构造函数中,问题就会消失
但真的,你不应该这么做raise
在这里为您捕获了一个合法的bug;它只是没有通过一条非常有用的错误消息来执行此操作。您能给我们一个小样本aicep_scrape_output.txt文件,以便我们调试它吗?可能有人已经问过这个问题,但是有什么原因让你不使用像DSM这样的高级库吗?@DSM:总的来说,这是个好问题……但是如果他所做的只是将异构CSV连接到一个超集CSV中,以便在Excel或其他应用程序中使用,pandas
不会添加任何有用的内容(除非在发生双重意外情况时可能会有更好的错误消息…).我印象深刻。此外,即使代码成功,gc\u all:
中的下一行也肯定会失败。@TimPietzcker:这一点很好。此外,考虑到他显然想将一组CSV文件连接在一起,使用w
而不是a
或w+
可能是个坏主意……“他”会将模式更改为w+,这也是一个非常好的回答。非常感谢。我在这个网站上发布了一些无知的问题,但很少有人回答我的问题,我用清晰的句子解释了如何理解和解决错误。干杯@goldisfine:在尝试在文件末尾迭代之前,您还需要从开始搜索(或在'r'
模式下关闭然后重新打开);否则,它只会成功地不输出任何内容(因为您已经在文件末尾)。顺便说一句,如果引号中的“他”是因为你实际上是一个“她”(或者是一个无性别的AI或者一个性别无法用地球上微不足道的词语来描述的外星人),那么道歉;你的小缩略图看起来是一个男人的,但并不是每个人的缩略图实际上都是用户的图片,所以这是一个愚蠢的假设。
def _dict_to_list(self, rowdict):
if self.extrasaction == "raise":
wrong_fields = [k for k in rowdict if k not in self.fieldnames]
if wrong_fields:
raise ValueError("dict contains fields not in fieldnames: " +
", ".join(wrong_fields))
return [rowdict.get(key, self.restval) for key in self.fieldnames]