我有一个包含字段名称的电子表格:

[“名称”,“职业”,“公司”,“地址”,“地址_2”,“城市”,“州”,“邮编”,“电话”,“传真”,“电子邮件”,“网站”,“描述']

并希望将包含较少字段名称的其他数据电子表格添加到此电子表格中(尽管其他所有字段名称都包含在此电子表格中)。

我收到一个奇怪的错误:

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]


当我运行以下命令时:

import csv

# compile master spreadsheet
with(open('gc_all.txt','w')) as gc_all:

    fieldnames = ['name', 'occupation', 'company', 'address', 'address_2','city', 'state', 'zip', 'phone,' 'fax', 'email', 'website', 'description']
    gc_all_dict = csv.DictWriter(gc_all, fieldnames = fieldnames, delimiter = '\t')
    print gc_all_dict.fieldnames

    with(open('/Users/samuelfinegold/Documents/noodle/aicep/aicep_scrape_output.txt', 'rU')) as aicep:
        aicep_dict = csv.DictReader(aicep, fieldnames = fieldnames, delimiter = '\t')
        for row in aicep_dict:
#             print row
            gc_all_dict.writerow(row)


    for row in gc_all:
        print row


伪造数据:

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  [email protected] www.stepUp.com  A great counselor
Bob B. Bob      For Your Rights 12 2nd Ave      San Francisco   CA  94109   1234567891  1234567891  [email protected]
Snob Job        Marley Inc. 12 1st Ave      Denver  CO  80231   1234567891  1234567891  [email protected]     What a counselor!

最佳答案

真正的问题在于,尽管您有问题要声明,但此电子表格中未包含其他所有字段名。

您可以看一下上面提出的那条线。 DictWriter._dict_to_list看起来像这样:

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中的字段。



但是,为什么在尝试创建错误时引发奇怪的错误呢?因为缺少的字段被命名为NoneDictWriter代码并非用于处理此问题。所以,这就是问题2。



为什么将该字段命名为None?因为DictReader每当它找到不适合您提供的fieldnames的列时,这就是产生的结果。您可以通过print row看到此内容:dict的元素之一将类似于None: 'foo'。因此,这就是问题3。



那么如何解决这个问题?

好吧,显而易见的事情是使您的主张正确:使目标中的字段成为源中字段的严格超集。

或者,您可以告诉您的DictReader跳过多余的字段,或者让您的DictWriter忽略它们而不是加注。例如,只需将extrasaction='ignore'添加到DictWriter构造函数中,问题就会消失。

但实际上,您不应该那样做。 raise在这里为您找到了一个合法的错误;它只是没有这样做,却带有一个非常有用的错误消息。

关于python - 添加到现有电子表格?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17686328/

10-12 22:41