Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否添加到现有电子表格?_Python_Csv - Fatal编程技术网

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]