2012-04-14 84 views
0

這是我的第一個蟒蛇(2.4)程序,我可以使用你的幫助。 我有一個csv文件Python:讀取輸出腳本兩次,並寫入兩列csv

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

即執行一個命令到第2欄/行[1]

每個路徑我搜索文本並將其追加到新列的命令的輸出。

實例命令輸出:

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 

我havnt還沒有得到它與讀取相同的輸出線和追加兩列一起工作不同的結果。我嘗試關閉作家,並在同一位讀者中打開一個新的,沒有喜樂。我嘗試過沒有運氣的縮進。我得到的最接近的是準確地搜索這兩個字符串,但它只寫入一列。

我也曾嘗試首先搜索的操作系統平臺和寫作的變化到新文件 然後,打開新文件寫入另一行

當然,我可能會迫使該通過再次運行命令工作並單獨搜索,但那是多餘的和不必要的。

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() 

回答

1

從輸出中收集您想要的所有信息,然後使用一次調用將其寫出到writerow()。例如,

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

當然,你將逐步建立newdata,通過解析腳本的結果。

PS。更新你的python! 2.4太老了。更新將以無數方式讓您的生活更輕鬆。

+0

不幸的是,這是一個我無法升級的生產服務器。感謝您的幫助,我會看到我的位置。 – Tommy 2012-04-16 21:20:45

+0

我認爲這可能是一個簡單的解決方法,它是。非常感謝,謝謝亞歷克西斯 – Tommy 2012-04-17 12:37:49

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執行:文件

如果你不想使用管道,與條款使用手柄開啓/關閉:

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) 
+0

即時通訊運行2.4,我無法升級,這就是爲什麼即時通訊不使用語句。希望我可以,我見過很多使用它們的例子 – Tommy 2012-04-14 21:44:15

+0

我喜歡這個概念,在使它符合2.4並且將繼續測試它之後,我幾乎得到了它的工作。感謝您的輸入vsekhar – Tommy 2012-04-17 12:39:39