Сбор комментариев из Reddit, вывод в файл CSV - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь собрать комментарии из определенной публикации в Reddit и вывести их в файл CSV.

import praw
import csv

reddit = praw.Reddit(client_id='ClientID', client_secret='ClientSecret', user_agent='UserAgent')

Submission = reddit.submission(id="SubmissionID")

with open('Reddit.csv', 'w') as csvfile:
    for comment in submission.comments:
        csvfile.write(comment.body)

Проблема состоит в том, что для каждой ячейки комментарии кажутся случайно разделенными. Я хочу, чтобы каждый комментарий находился в отдельной ячейке. Есть идеи как этого добиться?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2020

Чтобы записать CSV-файл в Python, используйте модуль csv , в частности csv.writer(). Вы импортируете этот модуль вверху вашего кода, но никогда не используете его.

Используя это в своем коде, это выглядит так:

with open('Reddit.csv', 'w') as csvfile:
    comment_writer = csv.writer(csvfile)
    for comment in submission.comments:
        comment_writer.writerow([comment.body])

Здесь мы используем csv.writer() для создайте средство записи CSV из файла, который мы открыли, и мы называем его comment_writer. Затем для каждого комментария мы записываем еще одну строку в файл CSV. Строка представлена ​​в виде списка. Поскольку у нас есть только один фрагмент информации для записи в каждой строке, список содержит только один элемент. Строка: [comment.body].

Модуль csv позаботится о том, чтобы значения с новыми строками, запятыми или другими специальными символами были правильно отформатированы как значения CSV.


Обратите внимание, что для некоторых представлений с большим количеством комментариев ваш код PRAW может вызвать исключение в виде 'MoreComments' object has no attribute 'body'. Документы PRAW обсуждают это , и я призываю вас прочитать это, чтобы узнать больше, но знайте, что мы можем избежать этого в коде, изменяя нашу l oop:

from praw.models import Comment

# ...

with open('Reddit.csv', 'w') as csvfile:
    comment_writer = csv.writer(csvfile)
    for comment in submission.comments:
        if isinstance(comment, Comment):
            comment_writer.writerow([comment.body])

Кроме того, ваш код получает только комментарии верхнего уровня. Если вас интересует больше, см. этот вопрос , в котором рассказывается о том, как получить из представления больше, чем просто комментарии верхнего уровня.

0 голосов
/ 19 февраля 2020

Я предполагаю, что ячейки не разделяются случайным образом, а разделяются запятой, точкой с запятой. Вы можете выбрать символ, на который хотите разделить ячейки, используя параметр разделителя.

import csv

with open('Reddit.csv', 'w') as csvfile:
    comments = ['comment one','comment two','comment three']
    csv_writer = csv.writer(csvfile, delimiter='-')
    csv_writer.writerow(comments)
0 голосов
/ 19 февраля 2020

Вы импортируете библиотеку csv, но фактически не используете ее. Используйте его, и ваша проблема может go прочь.

https://docs.python.org/3/library/csv.html#csv .DictWriter

import csv
# ...    
comment = "this string was created from your code"
# ...
with open('names.csv', 'w', newline='') as csvfile:
    fieldnames = ['comment']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'comment': comment})
...