1

ここで尋ねた質問に加えて、エラー例外を整理するのに行き詰まっています。別のファイルからファイルのリストを読み取ることを整理しましたが、参照されているファイルのいずれかが存在しない場合に苦労しています。エラーを特定し、電子メールで送信してから、後で使用するためにファイルを作成できるようにしたいと考えています。しかし、入れている「try, except, else」ブロックでインデント エラーが発生します。動作するはずですが、実行できません。ガッ!ヘルプ!!!

ログ テキスト ファイルには、次の内容が含まれます。

//server-1/data/instances/devapp/log/audit.log

//server-1/data/instances/devapp/log/bizman.db.log

//server-1/data/instances/devapp/log/foo.txt # このファイルはサーバーに存在しません

私のコードは次のとおりです。プログラムの早い段階でそれを壊している場合に備えて、スニペットではなく全体を投稿するのが最善だと思いました!

import os, datetime, smtplib
today = datetime.datetime.now().strftime('%Y-%m-%d')
time_a = datetime.datetime.now().strftime('%Y%m%d %H-%M-%S')
checkdir = '/cygdrive/c/bob/python_'+ datetime.datetime.now().strftime('%Y-%m-%d')+'_test'
logdir = '/cygdrive/c/bob/logs.txt'
errors = '/cygdrive/c/bob/errors.txt'

#email stuff
sender = 'errors@company.com'
receivers = 'bob@company.com'
message_1 = """From: errors <errors@company.com>
To: Bob <bob@company.com>
Subject: Log file not found on server

A log file has not been found for the automated check. 
The file has now been created.
""" 
#end of email stuff


try:
                os.chdir (checkdir) # Try opening the recording log directory    
except (OSError, IOError), e: # If it fails then :
                os.mkdir (checkdir)  #  Make the new directory
                os.chdir (checkdir)  #  Change to the new directory
                log = open ('test_log.txt', 'a+w') #Create and open log file
else :
                log = open ('test_log.txt', 'a+w') #Open log file

log.write ("***starting file check at %s  ***\r\n\r\n"%tme_a)

def log_opener (logdir) :
    with open(logdir) as log_lines:  #open the file with the log paths in
        for line in log_lines:  # for each log path do :
            timestamp = time_a + ('  Checking ') + line + ( '\r\n' )
            try:
                with open(line.strip()) as logs:
            except (OSError,IOError), e:
                try:
                smtpObj = smtplib.SMTP('localhost')
                smtpObj.sendmail(sender, receivers, message)         
                log.write (timestamp)
                log.write ("Log file not found.  Email sent.  New file created.")
            except SMTPException:
                log.write (timestamp)
                log.write ("Log file not found.  Unable to send email.  New file created.")
            
        else :  #  The following is just to see if there is any output...  More stuff to be added here!
            
            print line + ( '\r\n' )
            log.write (timestamp)
            print "".join(logs.readlines())
            
print log_opener(logdir)

私が得ているエラーは次のとおりです。

$ python log_5.py
  File "log_5.py", line 38
    except (OSError,IOError), e:
    ^
IndentationError: expected an indented block

私が知る限り、それはうまくいくはずですが...

追加のメモとして、私は長い間学習していないので、私のコードの多くはさまざまなチュートリアルから変更したり、ここや Web の他の場所から借りたりしています。私はここで非常に基本的な間違いを犯している可能性があります。

助けてくれて本当にありがとうございます!

4

1 に答える 1

6

この行の下にコード ブロックはありません。

with open(line.strip()) as logs:

try:、、、のようなすべての行にはdef ...:、インデントされたコード ブロックwith ...:for ...:必要です。

あなたのコメントに答えて、コードをより小さな関数に分割して、物事を明確にすることができます。したがって、次のようなものがあります。

def sendEmail(...):
    try:
        smtpObj = smtplib.SMTP('localhost')
        ...
    except SMTPException:
        ...

def log_opener(...):
    try:
        with open(line.strip()) as logs:
            sendEmail(...)
    except (OSError,IOError), e:
        ....

tryそうすれば、と の間に多くの行が入ることはなく、exceptネストされたtry/exceptブロックを避けることができます。

于 2013-05-16T19:50:07.857 に答える