0

次のpython 2.5スクリプトは機能しますが、私は初心者なので、明らかな間違いや、達成しようとしているより良い方法があるのではないかと思いますか?

目的は、当日のログ (「/Library/Application Support/Perceptive Automation/Indigo 5/Logs/」) を開いて、単語エラーを含む行を抽出し、新しいエラーのみを電子メールで送信することです。エラー行が抽出された後、 で行数がカウントされます ( prenumLines) tmp.txt。次に、抽出された行がtmp.txtファイルに書き込まれ、行が再度カウントされます ( postnumLines)。より大きい行番号prenumLinesは「theBody」に出力され、電子メールで送信されます。

from datetime import date
import linecache

fileDate = str(date.today())

theBody = []

tmpFile = open('/Library/Application Support/Perceptive Automation/Indigo 5/Logs/tmp.txt')

prenumLines = sum(1 for line in tmpFile)

log= open( '/Library/Application Support/Perceptive Automation/Indigo 5/Logs/' + fileDate + ' Events.txt', 'r' )

tmpFile = open('/Library/Application Support/Perceptive Automation/Indigo 5/Logs/tmp.txt', 'w')

for line in log:
    if 'Error' in line: 
    tmpFile.write(line )
log.close()
tmpFile.close() 

postnumLines = sum(1 for line in open('/Library/Application Support/Perceptive Automation/Indigo 5/Logs/tmp.txt'))

lineNum  = prenumLines

while lineNum < postnumLines:
    theBody.append(linecache.getline( '/Library/Application Support/Perceptive Automation/Indigo 5/Logs/tmp.txt', lineNum + 1) )
    lineNum = lineNum + 1
tmpFile.close() 

theBody =  "".join(theBody)  

#theBody is the body of  an email which is sent next
#print theBody
4

2 に答える 2

0

私の経験から言えば、実際に検討すべき変更 (私はmustを使用しますが、これは単なる推奨事項にすぎません) と、より個人的なスタイル (私がshouldを使用する場所) のいくつかの変更があります。

メタ レベル: あなたの質問はもともととしかタグ付けされていなかったため、おそらく注目されませんでした。SOでより多くのフォロワーを持つを使用する必要があります。

ファイル内で TAB およびスペース文字を使用してはなりません。そのため、ソースは実際には SO で正しくインデントされていません。行: は、その上のステートメントtmpFile.write(line)の 1 レベル下にインデントする必要があります。if

ファイル名と同じ文字列を 4 回使用してはならず、変数に置き換えてください。そして、共通ベースディレクトリからその変数を作成しますos.path.join()

Python のスタイル ガイドであるPEP8に従うこと検討する必要があります。

「tmp.txt」が存在しないため、これを初めて実行しようとすると、プログラムは実行されません。0 の prenumLines で正常に失敗します (ただし、これはもうまったく使用していません。以下を参照してください)。

try:
    # open the file
    # count the lines
except:
    prenumLines = 0

最後のログからのtmp.txtエラー行を上書きして書き込むだけなので、コードが機能すると述べているのは実際には不思議です。もう一度割り当てた瞬間に、読み取り用の最初のオープンが閉じられます。次に、書き込み用に開いたものを 2 回閉じます(Python はエラーをスローしません)。昨日のログに 1 つのエラーがあり、今日のログに 3 つのエラーがあった場合、メールには 2 行しか表示されません。ファイルに追加するには、open(filename, 'a') を使用しますtmpFiletmpFile

ファイルを読み書きするときは、 withステートメント (Python 2.5 の新機能) を使用すること検討する必要があります。そうすれば、(誤ったステートメント) を省くことができます。.close()

文字列として作成し、行を追加すること検討する必要があります。theBody最初にリストを使用して結合する方が速いかもしれませんが、このスクリプトは 1 日に 1 回しか実行されません。

行を数えてエラー行を追加し、それらを再読み込みして に保存するtheBody必要ありません。最初と 3 番目の部分を省略して、一度にすべて実行する必要があります。

from __future__ import with_statement

import os
from datetime import date

baseDir = '/Library/Application Support/Perceptive Automation/Indigo 5/Logs'
tmpFileName = os.path.join(baseDir, 'tmp.txt')

fileDate = str(date.today())
eventFileName = os.path.join(baseDir, fileDate + ' Events.txt')

theBody = ''

with open(tmpFileName, 'a') as tmpFile:
    with open( eventFileName, 'r' ) as log:
        for line in log:
            if 'Error' in line:
                tmpFile.write(line)
                theBody += line

# theBody is the body of  an email which is sent next
print theBody
于 2013-03-23T07:22:43.237 に答える
0

Anthon - 返信にお時間を割いていただき、誠にありがとうございます。ログを生成するソフトウェアは、ホーム オートメーション プログラムである Perceptive Automation Indigo です。毎日生成される新しいログで継続的にログに書き込みます。10 分ごとにログを解析してエラーを探し、メールで送信するように Python スクリプトを設定しました。私が抱えていた課題は、新しいエラーのみをメールで送信し、以前に送信されたエラーを避けることでした. 私がこれを行った方法は、tmp.text の行数を数えてから、新しいエラーを追加することでした。エラーが以前に書き込まれている場合は、あなたが言及したように上書きされます。したがって、tmp.txt に 5 行あり、さらに 3 行追加すると、新しい 3 行のみが送信されます。with ステートメントを使用してスクリプトを短縮し、close ステートメントを削除することを提案したいくつかの変更を加えました。また、ファイル名を変数に置き換えました。これを行った後、スクリプトは正常に実行されましたが、ソフトウェアの設計上の理由により、「with ステートメント」を含むスクリプトを使用できません。with ステートメントを削除するには、スクリプトを書き直す必要があります。大変お世話になり、誠にありがとうございました。

于 2013-03-26T12:57:14.413 に答える