Python - 接收unboundlocalError

时间:2015-11-18 21:35:21

标签: python

我正在使用linux并将文件放在终端的底部。 我收到以下错误:

Impossible d'ouvrir le fichier Traceback(最近一次调用最后一次):   文件“TR5.py”,第131行,in     主(sys.argv中[1:])   在主要文件中输入“TR5.py”,第75行     对于文件中的行: UnboundLocalError:赋值前引用的局部变量'file'

出了什么问题?

#!/usr/bin/env python
#-*- coding: utf-8 -*-
#################################################################################
#NAME: TR5  // TWITTER AUTOREPORTER 5.0                 #
#OP: #opIceISIS // #opFocalpoint                        #
#                                       #
#USAGE: $ cd YOUR_DOWNLOAD_FOLDER                       #
#   $ python TR5.py -u TWITTER_USERNAME -i TWITTER_URL_ONLY_TARGETSLIST.txt #
#################################################################################

from splinter import Browser
import sys, getopt, re
from datetime import datetime
from splinter.request_handler.status_code import HttpResponseError
import time

def main(argv):

    d = datetime.now()
    date = str(d.year) + '' + str(d.month) + '' + str(d.day) + '' + str(d.hour) + '' + str(d.minute) + '' + str(d.second)
    try:
        opts, args = getopt.getopt(argv,"hi:u:",["file=","user="])
    except getopt.GetoptError:
        print 'twitterReport.py -u <Twitter username> -i <file>'
        print 'Le fichier des profiles doit comporter une URL par ligne ++'
#        sys.exit(2)

    for opt, arg in opts:
        if opt == '-h':
            print 'twitterReport.py -u <Twitter username> -i <file.txt>'
            print 'Le fichier des profiles doit comporter une URL par ligne'
            sys.exit()
        elif opt in ("-i", "--file"):
            txt = arg
        elif opt in ("-u", "--user"):
            username = arg

    password = raw_input("Enter your twitter password : ")

    try:
        username
        txt
    except getopt.GetoptError:
        print 'twitterReport.py -u <Twitter username> -i <file>'
        print 'Le fichier des profiles doit comporter une URL par ligne'
#        sys.exit()
# uncomment if you want to use privoxy + tor        
#    proxyIP = '127.0.0.1'
#    proxyPort = 8118
#
#    proxy_settings = {'network.proxy.type': 1,
#            'network.proxy.http': proxyIP,
#            'network.proxy.http_port': proxyPort,
#            'network.proxy.ssl': proxyIP,
#            'network.proxy.ssl_port':proxyPort,
#            'network.proxy.socks': proxyIP,
#            'network.proxy.socks_port':proxyPort,
#            'network.proxy.ftp': proxyIP,
#            'network.proxy.ftp_port':proxyPort 
#            }
#
#    with Browser('firefox',profile_preferences=proxy_settings) as browser:
#    with Browser() as browser:
    with Browser() as browser:

        browser.visit("https://twitter.com/")
        browser.execute_script('document.getElementById("signin-email").value = "'+username+'"')
        browser.execute_script('document.getElementById("signin-password").value = "'+password+'"')
        browser.find_by_css('button[type="submit"].submit.btn.primary-btn').click()
        try:
            file = open(txt, 'r')
        except:
            print "Impossible d'ouvrir le fichier"

        for line in file:
            try:
                url = re.match(r"https?://(www\.)?twitter\.com/intent/(#!/)?@?([^/\s]*)",line.strip())
                url = url.group()
                browser.visit(url)
                if not browser.is_element_present_by_css('.route-account_suspended'):
            browser.find_by_css('a.fn.url.alternate-context').click()
                    browser.find_by_css('.user-dropdown').click()
                    browser.find_by_css('li.report-text button[type="button"]').click()
            time.sleep(2)
#           browser.choose('input[type="radio"][value="spam"]').click(1)
#           browser.find_by_css('.input[type="radio"][value="spam"]')[1].click()
#           browser.find_element_by_xpath(".//label")[1].click()
#           browser.find_elements_by_css_selector('.input[type="radio"][value="spam"]')[1].click()
#           browser.find_by_css('label.spam [type="radio"]').click()
#           browser.choose("spam")[1].click()
#           browser.find_elements_by_xpath(".//input[@type='radio' and @value='spam']")[0].click()
            browser.find_by_css('button.btn.primary-btn.new-report-flow-next-button[type="button"]')[0].click()
            time.sleep(2)
            browser.find_by_css('button.btn.primary-btn.new-report-flow-done-button[type="button"]')[0].click()
#                   browser.find_by_css('button.btn.primary-btn:nth-child(1)').click()
                    followers = browser.find_by_css('a[data-nav="followers"] .ProfileNav-value').value;
                    msg = url.strip()
                    with open("log_reported_"+date+".txt", "a") as log:
                        log.write(msg+"\n")
                elif browser.is_element_present_by_css('.route-account_suspended'):
                    msg =  line.strip()+' - Suspended'
                    with open("log_suspended.txt", "a") as log:
                        log.write(msg+"\n")
                else:
                    msg = line.strip()+' - Unknown'
                    with open("log_unknown.txt", "a") as log:
                        log.write(msg+"\n")

                print msg

            except KeyboardInterrupt:
                print 'Quit by keyboard interrupt sequence !'
                break
            except HttpResponseError:
                msg = line.strip()+' - HttpResponseError'
                print msg
                with open("log_Error.txt", "a") as log:
                    log.write(msg+"\n")
        pass
            except:
                if line:
                    msg = url.strip()+' - CatchAllError'
                    print msg
                    with open("log_Error.txt", "a") as log:
                        log.write(msg+"\n")
                else:
                    pass

if __name__ == "__main__":
    try:
        main(sys.argv[1:])
    except KeyboardInterrupt:
        sys.stdout.write('\nQuit by keyboard interrupt sequence !')

6 个答案:

答案 0 :(得分:1)

第75行是for line in file:,因此看起来file = open(txt, 'r')引发了异常。它打印出“Impossible d'ouvrir le fichier”然后继续,没有定义file变量。您的文件可能已锁定或不存在。

我至少会将第73行更改为此,因此您可以看到它尝试打开的文件的名称:

print "Impossible d'ouvrir le fichier:", txt

答案 1 :(得分:1)

    try:
        file = open(txt, 'r')
    except:
        print "Impossible d'ouvrir le fichier"
        return # <-- finish function 

    for line in file:

程序无法打开文件,但您尝试从该文件中读取行。

您可以在return之后添加print来完成功能和程序。

答案 2 :(得分:0)

尽管抛出了未打开文件的异常,但您正试图遍历文件的行。试试这个:

try:
   file = open(txt, 'r')
except:
   sys.exit("Impossible d'ouvrir le fichier")

然后,如果打开失败,脚本将停止。

答案 3 :(得分:0)

这是你的问题:

try:
    file = open(txt, 'r')
except:
    print "Impossible d'ouvrir le fichier"

for line in file:
# etc

如果打开文件时出错,则永远不会定义变量file。然而,即使出现错误,您仍然会进入for循环,因为file未定义而抱怨。

有很多方法可以解决这个问题。一种方法是在file块中将变量None设置为except,然后在循环之前使用if file:。您也可以在return块中的函数中except,因为如果无法打开文件,则无法执行任何操作。

顺便说一句,您应该捕获可能的最具体的异常(例如except IOError:),而不是使用裸except:来避免捕获您不想捕获的异常。

答案 4 :(得分:0)

尝试twitter autoreporter的优化(也可以)版本:https://ghostbin.com/paste/mr7yf

答案 5 :(得分:0)

您需要做的就是命名目标列表文件file.txt然后转到终端:

python TR5.py -u <@username> -i <file.txt>