Получение: "FileNotFoundError: [Errno 2] Нет такого файла или каталога: 'posts.txt'", хотя у меня есть такой файл - PullRequest
0 голосов
/ 05 июля 2018

Привет, ребята, так что я работаю над твиттер-ботом, который берет сообщения от reddit и пишет в Твиттере. Моя проблема сейчас заключается в том, что при запуске я получаю сообщение об ошибке «FileNotFoundError: [Errno 2] Нет такого файла или каталога:« posts.txt »».

Но дело в том, как вы увидите на изображении ниже и через мой code, posts.txt существует, и он находится в том же каталоге. Так что я застрял на том, что актуальная проблема есть. У меня есть почти идентичная программа для этого, где Функция «Already_Tweeted» работает, но единственное отличие состоит в том, что Также можно использовать файлы изображений (используя BeautifulSoup). Может ли это способствовать этому? ошибка?

Это не полный проект, а только то, что, мы надеемся, актуально

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

posted_reddit_ids = 'posted.txt'

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(id):
    '''reads through our .txt file and determines if tweet has already been posted'''
    found = 0
    with open(posted_reddit_ids, 'r') as f:
        for line in f:
            if id in line:
                found = 1
                break
    return found


def main():
    '''Main function'''
    # If the tweet tracking file does not already exist, create it
    if not os.path.exists(posted_reddit_ids):
        with open(posted_reddit_ids, 'w'):
            pass
    if not os.path.exists(img_dir):
        os.makedirs(img_dir)

    subreddit = setup_connection_reddit(subreddit_to_watch)
    post_links, post_titles, post_ids, post_imgs = tweet_creator(subreddit)
    tweeter(post_links, post_titles, post_ids,post_imgs)

if __name__ == '__main__':
    main()

Чтобы показать, что файл и программа находятся в одном каталоге

Edit:

Кажется, ошибка полностью исчезает, когда я удаляю post_imgs = get_image (submission.url)

Вот мой код для функции get_image, возможно, это поможет решить мою проблему

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:
        try:
            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
        except:
            mylist.append(None)
    print(mylist)
    return mylist

То, что я пытаюсь сделать здесь, это вернуть список файлов .jpg в функцию get_image, а затем скопировать этот список в post_imgs в функции tweet_creator.

1 Ответ

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

Я использую pathlib вместо модуля os , и он не вызвал FileNotFoundError:

#!/usr/bin/env python3.6
import time
import praw
import requests
import tweepy
from bs4 import BeautifulSoup as bs
from pathlib import Path

posted_reddit_ids = "posted.txt"


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(id):
    """reads through our .txt file and determines if tweet has already been posted"""
    return id in Path(posted_reddit_ids).read_text()


def main():
    """Main function"""
    # If the tweet tracking file does not already exist, create it
    Path(posted_reddit_ids).exists() or Path(posted_reddit_ids).write_text("")
    Path(img_dir).exists() or Path(img_dir).mkdir(parents=True)
    subreddit = setup_connection_reddit(subreddit_to_watch)
    post_links, post_titles, post_ids, post_imgs = tweet_creator(subreddit)
    tweeter(post_links, post_titles, post_ids, post_imgs)


if __name__ == "__main__":
    main()
...