Python 将对象列表写入csv文件
我正在编写一个python程序,它循环遍历reddit提交,提取数据,并将其作为对象存储在列表中。但是,我在将该列表写入csv文件时遇到问题。文件已创建,但它只是为对象提供某种id标记。我应该如何更改csv代码 代码Python 将对象列表写入csv文件,python,python-2.7,csv,praw,Python,Python 2.7,Csv,Praw,我正在编写一个python程序,它循环遍历reddit提交,提取数据,并将其作为对象存储在列表中。但是,我在将该列表写入csv文件时遇到问题。文件已创建,但它只是为对象提供某种id标记。我应该如何更改csv代码 代码 import praw from datetime import datetime import pandas as pd class Submission: def __init__(self, time, score, title, text, ofReddit, s
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')
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>
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')
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
您的submission类似乎只是一种记录类型。您可能只需要使用一个名为tuple的。因此,将类定义替换为:
from collections import namedtuple
Submission = namedtuple('Submission', ['time', 'score', 'title', 'text', 'ofReddit', 'serious'])
现在,剩下的代码应该可以正常工作了pandas
不知道如何解释您最初编写的Submission
类。因此,它只需创建一列Submission
对象,在编写时,它使用str(Submission())
,默认为对象,因为您没有定义另一个\uuu str
。真的,你想用序列。namedtuple
函数实际上是一个类工厂,它创建了一个从tuple
派生的记录类型,因此它具有您需要的所有方便的函数和一个非常方便的构造函数
现在,由于您使用的是Python2,所以我没有费心更改您对熊猫的使用,尽管仅将其用于编写csv似乎有些过分。尽管如此,让Python2CSV模块与unicode配合使用是一件痛苦的事情,所以您最好保留它。如果您可以切换到python3,只需将pandas
内容替换为:
import csv
with open(filename, 'w', newline='', encoding='utf8') as f:
writer = csv.writer(f)
writer.writerow(Submission._fields) # namedtuple breaks convention public fields have single underscore
writer.writerows(data)
你希望它写什么?这是默认的\uuuu str\uuuuu
实现,所有对象都继承自对象
。此外,您是否仅使用熊猫
来编写csv?看起来太过分了。您应该只使用csv
模块。对不起,我不熟悉这一切。仅仅使用csv更好吗?我希望编写这样的对象:{time:########,score:########……}尝试将此df=pd.DataFrame(data)
更改为此df=pd.DataFrame([obj.\uu dict\uuj代表数据中的obj])
。Pandas数据帧需要从Pandas理解的对象构造,一个选项是字典列表。@MarjoriePickard,带括号和冒号?试试下面我用的答案。非常感谢@MarjoriePickard当您发现自己正在编写一个类,希望用它来创建一组基本上起记录作用的对象(即,只有数据属性,没有方法),那么您可能只需要使用namedtuple
。这将为您编写一个非常高效的类@MarjoriePickard,当我说它为您编写类时,我的意思是,它生成一个类定义并执行它。您可以查看您的Submission
namedtuple类的确切外观,签出print(Submission.\u source)