【问题标题】:dict contains fields not in fieldnames: Cannot write data into CSVdict 包含不在字段名中的字段:无法将数据写入 CSV
【发布时间】:2020-05-15 09:30:26
【问题描述】:

我正在尝试将列表数据追加到 CSV 文件中。这是我的代码:


body = {
        'dont-ask-for-email': 0,
        'action': 'submit_user_review',
        'post_id': 76196,
        'email': email_random(),
        'subscribe': 1,
        'previous_hosting_id': prev_hosting_comp_random(),
        'fb_token': '',
        'title': review_title_random(),
        'summary': summary_random(),
        'score_pricing': star_random(),
        'score_userfriendly': star_random(),
        'score_support': star_random(),
        'score_features': star_random(),
        'hosting_type': hosting_type_random(),
        'author': name_random(),
        'social_link': '',
        'site': '',
        'screenshot[image][]': '',
        'screenshot[description][]': '',
        'user_data_process_agreement': 1,
        'user_email_popup': '',
        'subscribe_popup': 1,
        'email_asked': 1
}
from csv import DictWriter
fields = ['DontAskForEmail','Action','PostID','Email','Subsribe','PreviousHostingID','FbToken','Title','Summary','Pricing','UserFriend']
def datasent(r3eData, body, fields):
        with open(r3eData, 'a+', newline='') as writeData:
                dict_writer = DictWriter(writeData, fieldnames = fields)
                dict_writer.writerow(body)
datasent('r3edata.csv', body, fields)

当我运行它时,我得到了这个错误dict contains fields not in fieldnames: 这是回溯:

[root@b00gi3m4n boogieman]# python codeOffshoreupdated.py 
https://www.facebook.com/AedanKerr
Traceback (most recent call last):
  File "codeOffshoreupdated.py", line 120, in <module>
    datasent('r3edata.csv', body, fields)
  File "codeOffshoreupdated.py", line 119, in datasent
    dict_writer.writerow(body)
  File "/usr/lib64/python3.7/csv.py", line 155, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
  File "/usr/lib64/python3.7/csv.py", line 151, in _dict_to_list
    + ", ".join([repr(x) for x in wrong_fields]))
ValueError: dict contains fields not in fieldnames: 'screenshot[description][]', 'email_asked', 'action', 'title', 'score_support', 'social_link', 'email', 'score_features', 'summary', 'score_pricing', 'author', 'previous_hosting_id', 'dont-ask-for-email', 'post_id', 'site', 'user_data_process_agreement', 'subscribe', 'fb_token', 'subscribe_popup', 'screenshot[image][]', 'hosting_type', 'score_userfriendly', 'user_email_popup'

我该如何解决这个问题?

另外,我还有一个问题。 我希望每 10 分钟更新一次此列表,并且我不想丢失每次更新的任何先前数据。这个方法是每次都会更新列表还是会覆盖以前的数据并更新新列表?

如果它会覆盖数据,我如何将新数据更新到新行中? (请原谅我的英语,如果你不明白,我可以在 cmets 中解释更多) 提前致谢

【问题讨论】:

  • 你可以参考这个答案来解决你的错误:stackoverflow.com/a/26944519/6618812
  • 好的,我会的。你也能回答我的问题吗?
  • 答案就在你面前。 body dict 有,例如dont-ask-for-email 键,但您的查询中有一个 DontAskForEmail 字段。确保它们是相等的字符串(即在您的 fields 中传递 dont-ask-for-email 代替)。对于具有冲突字段的所有其他键也是如此。

标签: python python-3.x list python-2.7 export-to-csv


【解决方案1】:

问题似乎与您的fields 的长度有关,但由于某种原因,我无法使用 DictWrite 到达那里。因此,另一种方法是将整个内容加载到 pandas 数据帧并将其写入 csv 文件:

columns = []
rows = []
chunks = body.split('}')
for chunk in chunks:  
    row = []
    if len(chunk)>1:        
        entry = chunk.replace('{','').strip().split(',')
        for e in entry:
            item = e.strip().split(':')
            if len(item)==2:
                row.append(item[1])
                if chunks.index(chunk)==0:
                    columns.append(item[0])
        rows.append(row)
df = pd.DataFrame(rows, columns = columns)
df.head()

输出:

    'dont-ask-for-email'    'action'    'post_id'   'email'     'subscribe'     'previous_hosting_id'   'fb_token'  'title'     'summary'   'score_pricing'     ...     'hosting_type'  'author'    'social_link'   'site'  'screenshot[image][]'   'screenshot[description][]'     'user_data_process_agreement'   'user_email_popup'  'subscribe_popup'   'email_asked'
0   0   'submit_user_review'    76196   email_random()  1   prev_hosting_comp_random()  ''  review_title_random()   summary_random()    star_random()   ...     hosting_type_random()   some_name_random()  ''  ''  ''  ''  1   ''  4   2 }

然后保存到 csv 使用:

df.to_csv ('r3edata.csv', index = False, header=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2015-01-12
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多