当前位置: 首页 > 知识库问答 >
问题:

将对象列表写入csv文件

农诚
2023-03-14

我正在编写一个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, 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>

共有1个答案

金英华
2023-03-14

你的提交类似乎只是一个记录类型。您可能只需要使用一个名为tuple的。因此,将类定义替换为:

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

现在,剩下的代码应该可以正常工作了pandas不知道如何解释您最初编写的提交的类。因此,它只需创建一列提交对象,在编写时,它使用str(Submission()),默认为对象,因为您没有定义另一个___。真的,你想用序列。namedtuple函数实际上是一个类工厂,它创建了一个从tuple派生的记录类型,因此它有一个非常方便的构造函数,可以提供您需要的所有方便的函数。

现在,既然你使用的是Python 2,我就懒得改变你对熊猫的使用,尽管只将它用于编写csv似乎有些过头了。话虽如此,让Python 2 csv模块很好地使用Unicode是一个痛苦,所以你不妨保留它。如果您可以切换到Python 3,您可以简单地将熊猫替换为:

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)

 类似资料:
  • 问题内容: 我有一长串以下形式的清单- 即列表中的值是不同的类型-浮点数,整数,字符串。如何将其写入csv文件,以便输出的csv文件看起来像 问题答案: Python的内置CSV模块可以轻松处理此问题: 假设您的问题中的清单定义为。您可以通过各种可选参数来调整输出CSV的确切格式,如上面链接的库参考页中所述。 Python 3更新

  • 我使用supercsv CsvBeanWriter将值写入csv文件。 示例类: 我得到的结果是: 注意

  • 问题内容: 我正在努力将列表字典写入.csv文件。 这是我的字典的样子: 我希望.csv文件看起来像: 首先,我写标题: 到目前为止很好…但是,我的问题是我不知道如何将一个列表分配给相应的列。例如: 将随机填充列。另一个问题是,我必须手动填写键,并且不能将其用于具有4个键的另一本词典。 问题答案: 如果您不关心列的顺序(因为字典是无序的),则可以简单地使用: 结果: 如果您确实关心订单,则需要对键

  • 我有一个长长的列表,列表的形式如下--- i、 列表中的值有不同的类型——float、int、string。如何将其写入csv文件,使输出的csv文件看起来像

  • 问题内容: 我有5个长度相同的列表,我想将它们写到CSV的5列中。到目前为止,我只能使用以下代码将一个代码写入一列: 如果我添加另一个循环,它只会将该列表写入同一列。有人知道获得五个单独列的好方法吗? 问题答案: 将它们更改为行 然后就

  • 我有5个相同长度的列表,我想把它们写在CSV的5列中。到目前为止,我只能用以下代码在一列中写一个: 如果我为循环添加另一个