2011-01-28 149 views
1

我試圖分析在「clientname'.txt的Python:解析與領域

hostname:comp1 
time: Fri Jan 28 20:00:02 GMT 2011 
ip:xxx.xxx.xx.xx 
fs:good:45 
memory:bad:78 
swap:good:34 
Mail:good 

每個部分由分隔以下格式AA幾個文件的種種罪狀冒號分隔的文件:哪來行0,2,6有2個字段...行1,3-5有3個或更多字段。 (我遇到的一個大問題是時間:行,因爲20:00:02是真正的時間而不是3個獨立的字段。

我有幾個這樣的文件,我需要解析。更多的線在一些具有多個字段的這些文件。

... 
for i in clients: 
if os.path.isfile(rpt_path + i + rpt_ext):   # if the rpt exists then do this 
    rpt = rpt_path + i + rpt_ext 
    l_count = 0 
    for line in open(rpt, "r"): 
     s_line = line.rstrip() 
     part = s_line.split(':') 
     print part 
     l_count = l_count + 1 
else:            # else break 
    break 

首先,我檢查,如果該文件存在第一,如果它再打開該文件,並解析它(最終)截至目前,我只是打印輸出(打印部分)以確保它正確解析 老實說,我現在唯一遇到的問題是時間:字段。我如何處理與所有其他字符完全不同的時間字段?總是在我的所有報告文件中的第二行。

回答

1

如果time是一個特殊的情況下,你可以這樣做:

[...] 
s_line = line.rstrip() 
if line.startswith('time:'): 
    part = s_line.split(':', 1) 
else: 
    part = s_line.split(':') 
print part 
[...] 

這將使你:

['hostname', 'comp1'] 
['time', ' Fri Jan 28 20:00:02 GMT 2011'] 
['ip', 'xxx.xxx.xx.xx'] 
['fs', 'good', '45'] 
['memory', 'bad', '78'] 
['swap', 'good', '34'] 
['Mail', 'good'] 

而且不依賴於time在文件中的位置。

0

如果時間字段總是第2行。爲什麼不能跳過它並分別解析它?

喜歡的東西

for i, line in enumerate(open(rpt, "r").read().splitlines()): 
    if i==1: # Special parsing for time: line 
     data = line[5:] 
    else: 
     # your normal parsing logic 
+0

我不得不跳過每行有1個以上的分隔符,而那些有1個以上的分隔符的行並不總是在文件的相同位置。 – MarkP 2011-01-28 23:20:54

+0

我無法遵循你正在努力完成的任務。你是否想要處理所有具有多於一個的行:不同的(除了時間:行)? – 2011-01-28 23:23:52

+0

我想解決方法是檢查每一行:然後如果它有超過3個單獨處理它?不知道如何做到這一點。 – MarkP 2011-01-28 23:26:19

2

分割方法具有以下語法split( [sep [,maxsplit]])並且如果maxsplit給出,它將使maxsplit + 1個部分。在你的情況下,你只需要將maxsplit設爲1.只需要split(':',1)就可以解決你的問題。

+0

+1,打我吧。 – 2011-01-28 23:20:21

1

設計考慮:

可靠地處理多餘的空白,包括空行和缺少冒號。

提取一個record_type,然後用它來決定如何解析該行的其餘部分。

>>> def munched(s, n=None): 
...  if n is None: 
...   n = 99999999 # this kludge should not be necessary 
...  return [x.strip() for x in s.split(':', n)] 
... 
>>> def parse_line(line): 
...  if ':' not in line: 
...   return [line.strip(), ''] 
...  record_type, remainder = munched(line, 1) 
...  if record_type == 'time': 
...   data = [remainder] 
...  else: 
...   data = munched(remainder) 
...  return record_type, data 
... 
>>> for guff in """ 
... hostname:comp1 
... time: Fri Jan 28 20:00:02 GMT 2011 
... ip:xxx.xxx.xx.xx 
... fs:good:45 
...  memory : bad : 78 
... missing colon 
... Mail:good""".splitlines(True): 
... print repr(guff), parse_line(guff) 
... 
'\n' ['', ''] 
'hostname:comp1\n' ('hostname', ['comp1']) 
'time: Fri Jan 28 20:00:02 GMT 2011\n' ('time', ['Fri Jan 28 20:00:02 GMT 2011']) 
'ip:xxx.xxx.xx.xx\n' ('ip', ['xxx.xxx.xx.xx']) 
'fs:good:45\n' ('fs', ['good', '45']) 
' memory : bad : 78 \n' ('memory', ['bad', '78']) 
'missing colon\n' ['missing colon', ''] 
'Mail:good' ('Mail', ['good']) 
>>>