0

ファイルを検証し、ファイルに関する多くの情報を表示するコマンド ライン ツールを実行する必要があります。この情報を txt ファイルにエクスポートできますが、多くの余分なデータが含まれています。ファイルに必要な行は 1 行だけです。

「署名のタイムスタンプ: Thu May 24 17:13:16 2012」

時間は異なる可能性がありますが、このデータを抽出してファイルに入れるだけです。コマンドライン自体またはおそらくpythonからこれを行う良い方法はありますか? Python を使用して検証するファイルを見つけてダウンロードし、コマンド ライン ツールを実行してファイルを検証し、データを取得してそのデータを電子メールで送信できるようにする予定です。

これはWindows PC上にあります。

ご協力いただきありがとうございます

4

4 に答える 4

5

これを行うために Python を使用する必要はありません。Unix 環境を使用している場合はfgrep、コマンドラインから直接使用して、出力を別のファイルにリダイレクトできます。

fgrep "The signature is timestamped: " input.txt > output.txt

Windows では、以下を使用できます。

find "The signature is timestamped: " < input.txt > output.txt
于 2012-08-02T21:52:13.450 に答える
2

コマンドラインユーティリティはいくつかの情報を「表示」すると述べているため、に出力される可能性があるstdoutため、1つの方法はPython内でユーティリティを実行し、出力をキャプチャすることです。

import subprocess
# Try with some basic commands here maybe...
file_info = subprocess.check_output(['your_command_name', 'input_file'])
for line in file_info.splitlines():
    # print line here to see what you get
    if file_info.startswith('The signature is timestamped: '):
        print line # do something here

これは、「python を使用してダウンロードして検索する」にうまく適合するはずです。つまり、urllib.urlretrieve を使用してダウンロードし (おそらく一時的な名前で)、一時ファイルに対してコマンド ライン util を実行して詳細を取得し、メールを送信するsmtplib...

于 2012-08-02T22:23:40.747 に答える
1

Python では、次のようなことができます。

timestamp = ''
with open('./filename', 'r') as f:
  timestamp = [line for line in f.readlines() if 'The signature is timestamped: ' in line]

私はこれをテストしていませんが、うまくいくと思います。より良い解決策があるかどうかはわかりません。

于 2012-08-02T22:00:03.517 に答える
0

あなたが持っているこのエクスポートされたファイルの正確な構文についてはよくわかりませんが、これには python のreadlines()関数が役立つかもしれません。

h=open(pathname,'r') #opens the file for reading
for line in h.readlines():
    print line#this will print out the contents of each line of the text file

テキスト ファイルの形式が毎回同じであれば、後は簡単です。そうでない場合は、次のようなことができます

for line in h.readlines():
    if line.split()[3] == 'timestamped':
         print line
         output_string=line

ファイルへの書き込みについては、ファイルを書き込み用に開き、h=open(name, "w")を使用h.write(output_string)してテキスト ファイルに書き込みます。

于 2012-08-02T22:01:00.130 に答える