2017-07-05 146 views
0

我在MongoDB中創建了一個數據庫,其中包含基於tweepy和NLTK的tweet和感傷分析。在使用MongoXport創建一個帶有MongoDB中存儲的數據庫數據集的CSV文件後,我決定探索更靈活的其他選項(特別是使用其他分隔符而不是「昏迷」),例如,使用Python本身來生成CSV文件。到目前爲止,我可以成功打印數據集,糾正ASCII和Unicode問題並使用「|」作爲分隔符,但是我很難從打印結果創建一個CSV文件。到目前爲止的代碼是如下:如何使用Python從MongoDB tweet數據庫創建.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文件?

非常感謝!

+0

你可以轉換從'data_python'到'str'的​​所有東西,只需用逗號打印它? – PYA

+0

爲什麼要從打印結果創建CSV?還是你打算創建一個'|'分隔CSV? – Tanu

+0

感謝您的評論朋友!我需要創建此CSV文件以便稍後在SQL數據庫中使用它。要在SQL中將CSV文件作爲平面文件源上傳,有時候逗號不是有效的分隔符,特別是如果tweet上的文本帶有逗號。 –

回答

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'] 
      ]) 
+0

非常感謝Martin,我會嘗試這個選項! –

+0

嗨馬丁,非常感謝您的建議。我申請,它工作得很好!唯一的問題是,當我在tweet文本中有「emoji」時,我收到以下錯誤消息:inline'return codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError:'charmap'codec can' t編碼位置161-162中的字符:字符映射到' –

+0

請問,你有沒有建議跳過「表情符號」字符?我試圖將'utf8'改爲'unicode_escape',但它不起作用。非常感謝! –

0

逗人,下面我想和大家分享的最終代碼,獲得的支持後,在stackoverflow好朋友。 Mongoexport有其優點,但如果您需要一些靈活性來定義自己的分隔符來創建CSV文件,則此代碼可能很有趣。唯一的問題是,你可能會失去「表情符號」字符,因爲它們通過UTF-8轉換爲文本代碼。無論如何,根據您的要求,這種限制可能不成問題。根據上面發佈的代碼,我從Mongo Client傳輸的查詢"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'] 
      ]) 
相關問題