Попытка зациклить каталоги для моей программы бота, но борется с этим - PullRequest
0 голосов
/ 06 июля 2018

Хорошо, так что немного введения. Я пытаюсь создать бота, который очищает изображения и сообщения от reddit и публикует их в Твиттере. Это не мой полный проект, но это почти все, что нужно.

Так что дело в том, что мне нужно загрузить изображения в каталог, и я назвал этот каталог «фото», но мне также нужно записать идентификаторы поста Reddit (что я делаю с другой функцией, не показанной здесь) в текстовый файл. и мне нужно прочитать его, чтобы проверить, если он уже был в Твиттере. Это то, что делает функция уже в твиттере.

Вот проблема, в моем первом цикле, он прочитает файл (который сейчас пуст) и затем перейдет к использованию функции get_image. Мне нужно изменить текущий каталог на каталог изображений, чтобы я мог хранить изображения, которые я делаю (os.chdir (img_dir)). Теперь каталог меняется, и когда я возвращаюсь, чтобы прочитать файл oldies.txt, он говорит, что его не существует, поскольку он находится в исходном каталоге, а не в каталоге pics.

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

import time
import os
from bs4 import BeautifulSoup as bs
import requests
import praw
import tweepy

def tweet_creator(subreddit_info):
    '''Goes through posts on reddit and extracts a shortened link, title & ID'''
    post_links = [] #list to store our links
    post_titles = [] #list to store our titles
    post_ids = [] #list to store our id's
    post_imgs = []
    print("[bot] extracting posts from sub-reddit")

    for submission in subreddit_info.new(limit=5):
        if not already_tweeted(submission.id):
            post_titles.append(submission.title)
            post_links.append(submission.shortlink)
            post_ids.append(submission.id)
            post_imgs = get_image(submission.url)
            print(post_imgs)

        else:
            print("Already Tweeted")
    return post_links, post_titles, post_ids, post_imgs

def already_tweeted(post_id):
    '''reads through our .txt file and determines if tweet has already been posted'''
    found = 0

    print(os.getcwd())
    with open(posted_reddit_ids, 'r') as f:
        for line in f:
            if post_id in line:
                found = 1
                break
    return found

def get_image(img_url):
    url = img_url
    r = requests.get(url, headers = {'User-Agent' : 'reddit Twitter tool monitoring (by /u/RivianJourneyMan)'})
    data = r.text
    soup = bs(data, 'lxml')

    image_tags = soup.findAll('img')

    os.chdir(img_dir)
    x = 0
    mylist = []
    for image in image_tags:
            url = image['src']
            source = requests.get(url, stream = True)
            if source.status_code == 200:
                img_file = img_dir + str(x) + '.jpg'
                with open(img_file, 'wb') as f:
                    f.write(requests.get(url).content)
                    mylist.append(img_file)
                    f.close()
                    x += 1
                    return img_file
            else:
                mylist.append(None)
    return mylist

Еще раз, это не мой полный код, а только соответствующие части, но это то, что он выводит, когда я его запускаю. Как вы можете видеть в функции alread_tweated, я попросил ее распечатать каталог, в котором я нахожусь, поскольку я зацикливаюсь, чтобы было легче увидеть проблему.

[bot] Setting up connection with reddit
[bot] extracting posts from sub-reddit
C:\Users\ali\PycharmProjects\cyberbot
pics0.jpg
C:\Users\ali\PycharmProjects\cyberbot\pics
Traceback (most recent call last):
  File "C:/Users/ali/PycharmProjects/cyberbot/rtbot_with_img2.py", line 154, in <module>
    main()
  File "C:/Users/ali/PycharmProjects/cyberbot/rtbot_with_img2.py", line 150, in main
    post_links, post_titles, post_ids, post_imgs = tweet_creator(subreddit)
  File "C:/Users/ali/PycharmProjects/cyberbot/rtbot_with_img2.py", line 58, in tweet_creator
    if not already_tweeted(submission.id):
  File "C:/Users/ali/PycharmProjects/cyberbot/rtbot_with_img2.py", line 81, in already_tweeted
    with open(posted_reddit_ids, 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'oldies.txt'

Теперь я искал повсюду и пытался найти столько решений, чтобы вернуться в исходный каталог, но ни одно из них не сработало. Я попробовал os.chdir ('..') и поместил его чуть выше 'return mylist []', но это не сработало. Я очень хочу зайти в каталог 'pics', чтобы загрузить мои изображения, а затем я хочу вернуться в свой оригинальный каталог, который является 'cyberbot', чтобы я мог прочитать свой файл oldies.txt, чтобы увидеть, если я уже пост в Твиттере

Возможно, эта картина того, как мои каталоги и файлы помогут

1 Ответ

0 голосов
/ 06 июля 2018

Примечание: Есть два способа решить эту проблему.

PS: os.chdir('..') должно работать

1) Получить путь к каталогам pics и oldies.txt

img_dir = "/Users/ali/PycharmProjects/cyberbot/pics"
oldies_dir = "/Users/ali/PycharmProjects/cyberbot"

def already_tweeted(post_id):
    # begin by changing the directory first
    os.chdir(oldies_dir)
    ...

def get_image(image_url):
    os.chdir(img_dir)
    ...

2) Если вы знаете полный путь к oldies.txt, вы можете установить его следующим образом, однако я не очень много использовал окна, но знаю, что синтаксис пути к файлу отличается от Unix.

posted_reddit_ids = "/full_path_of_file/oldies.txt"

Это позволит вашему файлу считываться где угодно из кода независимо от того, сколько раз вы меняете каталоги

...