字典包含不在字段名中的字段

ket*_*avo -1 python csv django serialization

这是我制作查询集的 csv 文件的函数

\n\n
  def esport_to_csv(self, tweets):\n        with open(\'tweets.csv\', \'w\') as new_file:\n            fieldnames = ["tweet_id", "text" , "user_screen_name", "user_name", "user_verified", "created_at", "user_time_zone", "user_location", "favorite_count", "retweet_count", "user_followers_count", "user_friends_count"]\n            csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames, delimiter=\'\\t\')\n            csv_writer.writeheader()\n            for tweet in tweets:\n                line = []\n                line.append(tweet["tweet_id"])\n                line.append(tweet["text"])\n                line.append(tweet["user_screen_name"])\n                line.append(tweet["user_name"])\n                line.append(tweet["user_verified"])\n                line.append(tweet["created_at"])\n                line.append(tweet["user_time_zone"])\n                line.append(tweet["user_location"])\n                line.append(tweet["favorite_count"])\n                line.append(tweet["retweet_count"])\n                line.append(tweet["user_followers_count"])\n                line.append(tweet["user_friends_count"])\n                csv_writer.writerow(line)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的服务器响应

\n\n
ValueError: dict contains fields not in fieldnames: 967563194582515712, \'RT @KEEMSTAR: When you have your fathers car & you tell everyone on the internet that your 15 year old ass bought it. t.co/bUhhrPw0\xe2\x80\xa6\', \'TKBrotherTK\', \'Team Kalvin\', False, \'2018-02-25T06:23:36+05:30\', \'Melbourne\', \'Australia\', 0, 0, None, None\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是函数调用的地方

\n\n
@list_route(methods=["post"])\n    def get_created_in_range(self, request):\n        response = {}\n        data = request.POST\n        start = dateutil.parser.parse(data[\'start\'])\n        end = dateutil.parser.parse(data[\'end\'])\n        page_no = data[\'page_no\']\n        export_to_csv = data.get(\'export_to_csv\', "false")\n        tweets = Tweet.get_created_in_range(start, end, int(page_no))\n        serializer = TweetSerializer(tweets, many= True)\n        if export_to_csv == "true":\n           self.esport_to_csv(serializer.data)\n        print(type(serializer.data[0]))\n        response["data"] = serializer.data\n        return Response(response, status= status.HTTP_200_OK)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果你可以在这里找到上面的函数调用

\n\n

if export_to_csv == "true":\n self.esport_to_csv(serializer.data)

\n\n

我在网上看到了一个解决方案,但我不知道如何在这里应用它

\n

avi*_*gil 5

您需要将 a 传递dictDictWriter,并告诉它忽略额外的字段(如果存在)。尝试这个:

  def esport_to_csv(self, tweets):
    with open('tweets.csv', 'w') as new_file:
        fieldnames = ["tweet_id", "text" , "user_screen_name", "user_name", "user_verified", "created_at", "user_time_zone", "user_location", "favorite_count", "retweet_count", "user_followers_count", "user_friends_count"]
        csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames, delimiter='\t', extrasaction='ignore')
        csv_writer.writeheader()
        for tweet in tweets:
            csv_writer.writerow(tweet)
Run Code Online (Sandbox Code Playgroud)