2014-04-04 56 views
0

我是python的新手,我搜索了一些文章,但沒有找到正確的語法來讀取文件並在python中執行awk行處理。我需要你的幫助來解決這個問題。python逐行數據處理

這是我的構建和部署的bash腳本看起來,我讀了bash中的configurationf文件,如下所示。

backup    /apps/backup 
oracle    /opt/qosmon/qostool/oracle oracle-client-12.1.0.1.0 

和bash的閱讀部分的腳本看起來像下面

while read line 
    do 
    case "$line" in */package*) continue ;; esac 
    host_file_array+=("$line") 
    done < ${HOST_FILE} 
for ((i=0 ; i < ${#host_file_array[*]}; i++)) 
    do 
    # echo "${host_file_array[i]}" 
    host_file_line="${host_file_array[i]}" 

    if [[ "$host_file_line" != "#"* ]]; 
    then 
     COMPONENT_NAME=$(echo $host_file_line | awk '{print $1;}') 
     DIRECTORY=$(echo $host_file_line | awk '{print $2;}') 
     VERSION=$(echo $host_file_line | awk '{print $3;}') 

     if [[ ("${COMPONENT_NAME}" == *"oracle"*) ]]; 
     then 
     print_parameters "Status ${DIRECTORY}/${COMPONENT_NAME}" 
     /bin/bash ${DIRECTORY}/${COMPONENT_NAME}/current/script/manage-oracle.sh ${FORMAT_STRING} start 
     fi 
    etc ......... 

如何同樣可以conveted到Python。這是我迄今在python中準備的。

f = open ('%s' % host_file,"r") 
array = [] 
line = f.readline() 
index = 0 
while line: 
    line = line.strip("\n ' '") 
    line=line.split() 
    array.append([]) 
    for item in line: 
     array[index].append(item) 
    line = f.readline() 
    index+= 1 
f.close() 

我試圖在Python分裂,因爲它們的配置文件沒有在所有的行相等的列數,我得到的指數必然錯誤。什麼是處理它的最好方法。

回答

1

我覺得字典這裏可能是一個不錯的選擇,你可以生成它們如下:

>>> result = [] 
>>> keys = ["COMPONENT_NAME", "DIRECTORY", "VERSION"] 
>>> with open(hosts_file) as f: 
...  for line in f: 
...   result.append(dict(zip(keys, line.strip().split()))) 
...  
>>> result 
[{'DIRECTORY': '/apps/backup', 'COMPONENT_NAME': 'backup'}, 
{'DIRECTORY': '/opt/qosmon/qostool/oracle', 'VERSION': 'oracle-client-12.1.0.1.0', 'COMPONENT_NAME': 'oracle'}] 

正如你看到這將創建一個字典列表。現在,當您訪問字典時,您知道其中一些可能不包含'VERSION'密鑰。有多種處理方法。您可以使用try/except KeyError或使用dict.get()獲取值。

例子:

>>> for r in result: 
...  print r.get('VERSION', "No version") 
...  
... 
No version 
oracle-client-12.1.0.1.0 
+0

我更關心的是下面,我已經寫在bash線。 爲((I = 0; I <$ {#host_file_array [*]};我++)) 做 #回聲 「$ {host_file_array [I]}」 host_file_line = 「$ {host_file_array [I]}」 如果[[「$ host_file_line」!=「#」*]]; then COMPONENT_NAME = $(echo $ host_file_line | awk'{print $ 1;}') DIRECTORY = $(echo $ host_file_line | awk'{print $ 2;}') VERSION = $(echo $ host_file_line | awk'{打印$ 3;}') if [[(「$ {COMPONENT_NAME}」== *「oracle」*)]]; – user3493124

+0

更新了我的答案 – msvalkon

0
result = [line.strip().split() for line in open(host_file)]