2017-06-28 9 views
1

私は、redditの送信をループし、データをプルしてオブジェクトとしてリストに格納するPythonプログラムを作成しています。しかし、私はcsvファイルにそのリストを書くことに問題があります。ファイルが作成されますが、オブジェクトのIDタグが与えられます。 csvコードをどのように変更する必要がありますか?オブジェクトのリストをCSVファイルに書き込む

コード

import praw 
from datetime import datetime 
import pandas as pd 

class Submission: 
    def __init__(self, time, score, title, text, ofReddit, serious): 
     self.time = time 
     self.score = score 
     self.title = title 
     self.text = text 
     self.ofReddit = ofReddit 
     self.serious = serious 
data = [] 

reddit = praw.Reddit(client_id=id, client_secret=secret, 
        user_agent='testscript by /u/SilentButtDeadlies') 
subreddit = reddit.subreddit('AskReddit') 
for submission in subreddit.new(limit=50): 
    time = datetime.utcfromtimestamp(submission.created_utc).hour 
    score = submission.score 
    title = len(submission.title) 
    text = len(submission.selftext) 
    if 'of reddit' in submission.title.lower(): 
     ofReddit = 1 
    else: 
     ofReddit = 0 
    if '[serious]' in submission.title.lower(): 
     serious = 1 
    else: 
     serious = 0 
    data.append(Submission(time, score, title, text, ofReddit, serious)) 
df = pd.DataFrame(data) 
filename = 'AskRedditData' + str(datetime.now()) + '.csv' 
df.to_csv(filename, index=False, encoding='utf-8') 

CSVは

0 
<__main__.Submission instance at 0x1118f6ef0> 
<__main__.Submission instance at 0x1118f68c0> 
<__main__.Submission instance at 0x1118f6950> 
<__main__.Submission instance at 0x1118c3758> 
<__main__.Submission instance at 0x11239c638> 
<__main__.Submission instance at 0x11239c5f0> 
<__main__.Submission instance at 0x112398908> 
<__main__.Submission instance at 0x112398998> 
<__main__.Submission instance at 0x112398878> 
<__main__.Submission instance at 0x1123989e0> 
<__main__.Submission instance at 0x112398c68> 
<__main__.Submission instance at 0x11239fe18> 
<__main__.Submission instance at 0x11239fe60> 
<__main__.Submission instance at 0x11239fea8> 
<__main__.Submission instance at 0x11239fef0> 
<__main__.Submission instance at 0x11239ff38> 
<__main__.Submission instance at 0x11239ff80> 
<__main__.Submission instance at 0x11239ffc8> 
<__main__.Submission instance at 0x112404050> 
<__main__.Submission instance at 0x112404098> 
<__main__.Submission instance at 0x1124040e0> 
<__main__.Submission instance at 0x112404128> 
<__main__.Submission instance at 0x112404170> 
<__main__.Submission instance at 0x1124041b8> 
<__main__.Submission instance at 0x112404200> 
<__main__.Submission instance at 0x112404248> 
<__main__.Submission instance at 0x112404290> 
<__main__.Submission instance at 0x1124042d8> 
<__main__.Submission instance at 0x112404320> 
<__main__.Submission instance at 0x112404368> 
<__main__.Submission instance at 0x1124043b0> 
<__main__.Submission instance at 0x1124043f8> 
<__main__.Submission instance at 0x112404440> 
<__main__.Submission instance at 0x112404488> 
<__main__.Submission instance at 0x1124044d0> 
<__main__.Submission instance at 0x112404518> 
<__main__.Submission instance at 0x112404560> 
<__main__.Submission instance at 0x1124045a8> 
<__main__.Submission instance at 0x1124045f0> 
<__main__.Submission instance at 0x112404638> 
<__main__.Submission instance at 0x112404680> 
<__main__.Submission instance at 0x1124046c8> 
<__main__.Submission instance at 0x112404710> 
<__main__.Submission instance at 0x112404758> 
<__main__.Submission instance at 0x1124047a0> 
<__main__.Submission instance at 0x1124047e8> 
<__main__.Submission instance at 0x112404830> 
<__main__.Submission instance at 0x112404878> 
<__main__.Submission instance at 0x1124048c0> 
<__main__.Submission instance at 0x112404908> 
+0

あなたは*それを書くために*何を期待していますか?これはデフォルトの '__str__'実装で、すべてのオブジェクトは' object'から継承します。 –

+2

また、csvを書くのに 'pandas' * only *を使っていますか?過度の殺人のようだ。あなたは単に 'csv'モジュールを使うべきです。 –

+0

申し訳ありませんが、私はこのすべてに新しいです。 CSVを使うだけでいいですか? {time:####、score:#### ...} –

答えて

1

ご提出クラスは、単にレコード型として機能しているようだファイル。あなたはたぶんnamedtupleを使うことができます。だからクラス定義を次のように置き換えてください:

from collections import namedtuple 
Submission = namedtuple('Submission', ['time', 'score', 'title', 'text', 'ofReddit', 'serious']) 

これで残りのコードはうまくいくはずです。 pandasあなたが最初に書いたあなたのSubmissionクラスをどのように解釈するのか分かりません。したがって、単にSubmissionオブジェクトの単一の列を作成し、書き込むときにstr(Submission())を使用します。を定義していないので、デフォルトでobject__str__になります。本当に、あなたはシーケンスを使いたいと思う。 namedtuple関数は実際にはクラスファクトリであり、tupleから派生したレコードタイプを作成したので、非常に便利なコンストラクタで必要な便利な機能をすべて備えています。

あなたはPython 2を使用しているので、私はpandasの使用を変更することはありませんでしたが、それはcsvを書くためにそれを使用することが過度のように思えます。つまり、Python 2のcsvモジュールをユニコードでうまくプレイさせることは苦痛なので、そのまま使用することもできます。あなたは、Python 3に切り替えることができれば、あなたは単にでpandasものを置き換えることができます:

import csv 
with open(filename, 'w', newline='', encoding='utf8') as f: 
    writer = csv.writer(f) 
    writer.writerow(Submission._fields) # we are being naughty here and using a private attribute 
    writer.writerows(data) 
+0

ありがとう! –

+2

@MarjoriePickard本質的にレコードとして機能するオブジェクトの束を作成するために使用するクラス(データ属性のみ、メソッドなし)を作成しようとしているクラスがある場合は、おそらく単に 'namedtuple'を使うことができます。これは非常に効率的なクラスを作成します! –

+0

@MarjoriePickardと私があなたのためにクラスを書くと言うとき、私は文字通り、クラス定義を生成して実行します。 'Submission' namedtupleクラスがどのように見えるかを正確に見ることができます。checkout' print(Submission._source) ' –

関連する問題