0

これは私の最初の python (2.4)プログラムであり、あなたの助けを借りることができます。私はcsvファイルを持っています

HOST, PATH
server1, /path/to/file1.py
server2, /path/to/file2.py
server3, /path/to/file3.py

列 2/行 [1] の各 PATH に対してコマンドを実行します。

コマンドの出力でテキストを検索し、それらを新しい列に追加します。

コマンド出力の例:

Command: python /path/to/file1.py
Output: server1 (NTFS) Reply:Yes

新しい csv ファイルを次のようにしたいと思います。

HOST, PATH, PLATFORM, REPLY
server1, /path/to/file1.py, Windows, Yes
server2, /path/to/file2.py, Linux, Yes
server3, /path/to/file3.py, BSD, No

私はまだ同じ出力行を読み込んで、異なる結果を持つ2つの列を追加することで動作するようになりました。ライターを閉じて、同じリーダー内で新しいライターを開こうとしましたが、喜びはありませんでした。運が悪かったのでインデントを試みました。私が得た最も近いものは、両方の文字列を正確に検索することですが、1つの列にしか書き込みません.

また、最初にOSプラットフォームを検索し、変更を新しいファイルに書き込んでみました。次に、新しいファイルを開いて別の行を書き込みます

もちろん、コマンドを再度実行して個別に検索することでこれを強制的に機能させることもできますが、それは冗長で不要です。

import datetime
import csv
import os, time
from stat import * # ST_SIZE etc
from subprocess import Popen, PIPE, STDOUT

# Set Date
now = datetime.datetime.now()
today = now.strftime("%m-%d-%Y")

# Files
filename = "my_list.csv"
results = "results/results_" + today + ".csv" # Eg. results_04-14-2012.csv

# Commands
command = "python"
SP = " "

incsv = open(filename, 'rb')
try:
    reader = csv.reader(incsv)

    outcsv = open(results, 'w')
    try:
        writer = csv.writer(outcsv)

        for row in reader:
            p = Popen(command + SP + row[1], shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
            stdout, empty = p.communicate()

            print 'Command: %s\nOutput: %s\n' % (command + SP + row[1], stdout)

            if not stdout:
                writer.writerow(row + ['PLATFORM']) # Create header for new column when first line is empty on stdout
            elif 'BSD' in stdout:
                writer.writerow(row + ['BSD'])
            elif 'Linux' in stdout or 'swap' in stdout or 'LLVM' in stdout or 'EBR' in stdout:
                writer.writerow(row + ['Linux'])
            elif 'NTFS' in stdout:
                writer.writerow(row + ['Windows'])
            else:
                writer.writerow(row + ['Error Scanning'])

                    reply = open(results, 'w')
                    try:
                        writer = csv.writer(platform)

                        for row in reader:

                            if not stdout:
                                writer.writerow(row + ['REPLY']) # Create header for new column when first line is empty on stdout
                            elif 'Reply:Yes' in stdout:
                                writer.writerow(row + ['Yes'])
                            elif 'Reply:No' in stdout :
                                writer.writerow(row + ['No'])

                            else:
                                writer.writerow(row + ['Error'])

                    finally:
                        reply.close()
    finally:
        outcsv.close()
finally:
    incsv.close()
4

2 に答える 2

1

入力行と出力行が 1:1 でマッピングされている場合、csv は必要ないかもしれません。各行を処理して、新しい行を吐き出すだけです。

方法 1: パイプ

import sys
import subprocess

def parse_csv(input, output):
    # echo headings with new columns
    print >> output, input.readline() + ', PLATFORM, REPLY'

    for line in input.readlines():
        server, _, path = line.partition(',')
        path = path.strip()
        p = subprocess.Popen(command + ' ' + path,
                             stdin=subprocess.PIPE,
                             stdout=subprocess.PIPE,
                             shell=True)
        stdout, _ = p.communicate()

        # your additional logic goes here based on contents of stdout

        # when ready to output, just print, e.g.
        print >> output, '%s, %s, %s' % (line, stdout, 'Yes')

if __name__ == '__main__':
    parse_csv(sys.stdin, sys.stdout)

で実行

$ cat servers_and_paths.csv | python add_two_columns.py > servers_paths_and_flags.csv

方法 2: ファイル

パイプを使用したくない場合は、 with 句を使用して開閉を処理します。

from contextlib import closing

if __name__ == '__main__':
    with closing(open('servers_and_paths.csv')) as input,
         closing(open('servers_paths_and_flags.csv', 'wb')) as output:
        func_name(input, output)
于 2012-04-14T19:38:08.437 に答える
1

出力から必要なすべての情報を収集し、 への 1 回の呼び出しを使用して書き出しますwriterow()。例えば、

newdata = ['BSD', 'Yes']
...
writer.writerow(row + newdata)

もちろんnewdata、スクリプトの結果を解析することにより、段階的に構築します。

PS。あなたのパイソンをアップデートしてください!2.4は古すぎる。更新すると、無数の方法で生活が楽になります。

于 2012-04-16T14:22:03.563 に答える