正在获得:“ FileNotFoundError:[Errno 2]没有这样的文件或目录:'posted.txt'”,即使我确实有这样的文件

时间:2018-07-05 03:24:11

标签: python function tweepy praw

  

伙计们,所以我正在开发一个Twitter机器人,该机器人可以接收来自reddit的帖子并发推文。我现在的问题是运行它时,出现“ FileNotFoundError:[Errno 2]没有这样的文件或目录:'posted.txt'”错误。

     

但事实是,您将在下图中以及通过我的   代码“ posted.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()

To show the file and program are in the same directory

编辑:

当我删除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

我要在这里完成的工作是在get_image函数中返回.jpg文件列表,然后将该列表复制到tweet_creator函数中的post_imgs。

1 个答案:

答案 0 :(得分:0)

我使用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()