如何使用Python从MongoDB tweet数据库创建.csv文件

时间:2017-07-05 03:23:02

标签: python mongodb csv twitter pymongo

我在MongoDB中创建了一个数据库,其中包含推文及其基于tweepy和NLTK的情感分析。在使用Mongoexport创建CSV文件并使用存储在MongoDB中的此数据库的数据集之后,我决定探索更灵活的其他选项(特别是使用其他分隔符而不是" coma"),例如,使用Python本身生成CSV文件。到目前为止,我可以成功打印数据集,纠正ASCII和Unicode问题并使用" |"作为分隔符,但是我很难从打印结果中创建CSV文件。到目前为止的代码如下:

import json
import csv
from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['twitter_db_stream_1']
collection = db['twitter_collection']
data_python = collection.find({"user.location":{"$exists":True},"user.location":{"$ne":"null"}},{"created_at":1,"text":1,"user.name":1,"user.location":1,"geo.coordinates":1,"sentiment_value":1,"confidence_value":1})

for data in data_python:
    print(data['created_at'],'|',data['text'].encode('utf8'),'|',data['user']['name'].encode('utf8'),'|',data['user']['location'],'|',data['sentiment_value'],'|',data['confidence_value'])

打印结果如下:

Tue Apr 18 06:51:58 +0000 2017 | b'Samsung Galaxy S8 International Giveaway @androidauth #giveaway | b'Matt Torok' | None | pos | 1.0

我尝试使用csv.writer添加以下代码,基于tutorias的一些示例,但它无法正常工作...

csv_file = open('Sentiment_Analisys.csv', 'wb')
writer = csv.writer(csv_file)

fields = [["created_at"],["text"],["user.name"],["user.location"],["sentiment_value"],["confidential_value"]] #field names
writer.writerow(fields)

for data in data_python:
    writer.writerow(data['created_at'],data['text'].encode('utf8'),data['user']['name'].encode('utf8'),data['user']['location'],data['sentiment_value'],data['confidence_value'])

csv_file.close()

请问,有人可以就如何从上面的打印结果创建此CSV文件给我一些指导吗?

非常感谢!

2 个答案:

答案 0 :(得分:0)

您似乎已复制了Python 2.x示例,但正在编写Python 3.x代码。这两个版本的CSV使用略有不同。此外,最好在处理文件时使用with语句,这样就无需在最后显式关闭文件。

writerow()获取字符串列表。您的字段名称被定义为列表列表,您的数据writerow()需要转换为使用列表,如下所示:

field_names = ["created_at", "text", "user.name", "user.location", "sentiment_value", "confidential_value"]

with open('Sentiment_Analisys.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(field_names)

    for data in data_python:
        csv_output.writerow(
            [
            data['created_at'],data['text'].encode('utf8', 'ignore'),
            data['user']['name'].encode('utf8'),
            data['user']['location'],
            data['sentiment_value'],
            data['confidence_value']
            ])

答案 1 :(得分:0)

亲爱的,下面我想在stackoverflow中得到好朋友的支持后分享最终的代码。 Mongoexport有其优点,但如果您需要一些灵活性来定义自己的分隔符来创建CSV文件,这段代码可能会很有趣。唯一的问题是你可能会丢失“表情符号”字符,因为它们通过UTF-8转换转换为文本代码。无论如何,根据您的要求,这种限制可能不是问题。从上面发布的上述代码中,我从Mongo客户端传输的查询"user.location":{"$ne":"null"}}存在差异,但在Python代码中,您应该将"null"更改为"None"。我希望我在下面找到合适的代码的旅程,以及我在这篇文章中给予朋友的支持,对未来的某些人来说可能会有用!最诚挚的问候!

import pymongo
import json
import csv
import numpy
import sys
from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['twitter_db_stream_1']
collection = db['twitter_collection']
data_python = collection.find({"user.location":{"$exists":True},"user.location":{"$ne":None}},{"created_at":1,"text":1,"user.name":1,"user.location":1,"sentiment_value":1,"confidence_value":1})

field_names = ["created_at", "text", "user.name", "user.location", "sentiment_value", "confidential_value"]

with open('Sentiment_Analisys.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output, delimiter="|")
    csv_output.writerow(field_names)

    for data in data_python:
        csv_output.writerow(
            data['created_at'],
            data['text'].encode('utf8', 'ignore'),
            data['user']['name'].encode('utf8'),
            data['user']['location'],
            data['sentiment_value'],
            data['confidence_value']
            ])