2013-07-03 159 views
0

這與我寫入xml文檔的問題有關。我試圖從一個電子郵件文件(TXT/HTML)讀取格式不重要,我想知道的是我如何尋找一個特定的字符串(即我的構建),這是永遠不會在同一個地方兩次,並有一個關聯字符串以及我感興趣的?順便說一句,我正在用python編寫這個腳本。我可以提供一個我提到的查找我試圖使用的信息的電子郵件類型的例子。使用python掃描文件以獲取特定字符串

我的代碼,因爲它位於:

with open('Daily Build Email 07012013.txt','r') as x: 
     b = 1 
     linka = b 
     linkm = b 
     for line in x: 
     print b,' + ',line 
     if "Link1" in line: 
     linka = line 
     string.strip (s[Link1: ]) 
     print "Link is ", linka 
     #else: 
     # continue 
     if "Link2" in line: 
     linkb = line 
     print "Link is ", linkm 
     else: 
      continue 
     b += 1 

x.close() 

的串條是隻讓行包含林卡和linkm網絡位置,因爲在打開的文件在\前行的領導人物我需要刪除這些字符,因此這些行只包含其中的鏈接。另外,我需要將兩個鏈接寫入另一個文件(build.xml),以便每次獲得新的構建電子郵件時都可以使用build.xml文件自動執行測試過程。此外,我還需要爲每個電子郵件消息提供2個或更多的構建版本(目前尚不確定)。

+0

您可能要包括樣本的輸入和輸出,澄清什麼你想,還有,你到目前爲止得到了多少代碼? –

+0

完成了,希望你對添加的內容感到滿意 – mjsummers

回答

0

我認爲你的主要問題是你的string.strip - 我假設你已經在文檔的某處看到過。 string.strip中的單詞string並不意味着在字面意思上,它的意思是用您想要剝離的字符串的名稱替換。您正在告訴該字符串(在這種情況下,可能是linka)以從其本身剝離主要字符。它需要一個字符列表,而不是一個字符串。它也不會修改字符串本身,但會返回一個新字符串,您可以將它放入同一個變量或另一個變量中。我認爲你所追求的更像是string.replace(fromstr,tostr),在這種情況下,linka=linka.replace("Link1: ","")

假設b是一個行計數器,你可能不希望else: continue或者 - 跳過循環的其餘部分,所以b不增加。

此外,你應該閱讀正則表達式 - 正則表達式 - 它們是你在這裏試圖做的完美。他們有一個陡峭的學習曲線(特別是如果你嘗試從實際的例子開始,他們可能很難閱讀),但是非常值得,而且對於這樣的事情來說是完美的。

我意識到那裏可能有調試代碼。

我會重寫上述所有如下:

import re 
for line in open('Daily Build Email 07012013.txt','r'): 
    match=re.match(r'Link1: (.*)',line) 
    if (match): 
      linka = match.group(1) 

    match=re.match(r'Link2: (.*)',line) 
    if (match): 
      linkb = match.group(1) 

所以這是不同的主要的事情(除了剝離所有的調試代碼等...)是使用正則表達式 - 使用該模塊re。指令match=re.match(r'Link1: (.*)',line)是發生所有魔術的地方。 Link1: (.*)是尋找的模式。在模式中,字母通常代表它自己 - 它在字符串的開始處搜索Link1:(在這種情況下,行. A single dot,can represent any character, and a *的開頭意味着0或更多。因此,括號之間的位表示查找任何數字(包括0)任何字符,正則表達式,除非另有說明,都是「貪婪的」 - 它們儘可能匹配,所以這將匹配到行尾,因爲這個位在括號內,它們被分配給一個「組」(後面會詳細介紹)

因此,這個re.match會搜索第二個參數(line)並且會嘗試匹配這個模式,如果它發現匹配,它會返回關於匹配的信息,否則它返回None。

在下一個li ne,我們說if (match): - 匹配通過這個測試,沒有失敗,所以這個代碼塊只在匹配的時候運行。我們從比賽中得到組(1)(即,第一個[在這種情況下只有]一組括號中的位 - 在「Link1:」之後的信息,我們把它放在linka中,嘿!我們完成了!

重複相同的鏈路2/LinkB的。

然後繼續到下一行。

完成!

+0

感謝您的建議和解釋碼 – mjsummers