2013-10-19 46 views
0

我在python中編寫一個腳本來搜索字符串,並且在遇到字符串時suposedly會做不同的事情。在Python中搜索和排序

import re, datetime 
from datetime import * 

f = open(raw_input('Name of file to search: ') 

strToSearch = '' 

for line in f: 
    strToSearch += line 

patFinder = re.compile('\d{2}\/\d{2}\/\d{4}\sA\d{3}\sB\d{3}') 
findPat1 = re.findall(patFinder, strToSearch) 


# search only dates 
datFinder = re.compile('\d{2}\/\d{2}\/\d{4}') 
findDat = re.findall(datFinder, strToSearch) 


nowDate = date.today() 

fileLst = open('cels.txt', 'w') 
ntrdLst = open('not_ready.txt', 'w') 

for i in findPat1: 
    for Date in findDat: 
     Date = datetime.strptime(Date, '%d/%m/%Y') 
     Date = Date.date() 
     endDate = Date + timedelta(days=731) 

     if endDate < nowDate: 
      fileLst.write(i) 
     else: 
      ntrdLst.write(i) 

f.close() 
fileLst.close() 
ntrdLst.close() 

toClose = raw_input('File was modified, press enter to close: ') 

所以基本上它搜索的日期和數字,然後同一個列表,但只有日期的字符串轉換日期,增加了2年每相比較,如果日期超過今天的日期,去ntrdLst,如果沒有,則fileLst。

我的問題是,它多次寫入相同的列表(i),並沒有進行排序。

我很害怕python和編程的新手,所以我在尋求你的幫助。在此先感謝

編輯:-----------------

正常輸出是這樣的(不包括日期和if語句)

27/01/2009年A448 B448 22/10/2001 A434 B434 2007年6月9日A825 B825 2007年6月9日A434 B434 06/05/2010 A826 B826

什麼,我想是如果我有date.today()之後的日期表示像27/01/2016寫入另一個文件和w我一直得到的帽子是打印此列表的腳本的30倍或不考慮if語句的腳本。

(對不起,如果該確實縮進的最後一個循環,而把它在這裏,我去錯了)

+0

這不就是for語句最後4行的縮進問題嗎? endDate變量不斷變化,但沒有任何反應,直到它在嵌套區域的最後一次迭代中發生,然後纔開始寫入。所以你不考慮findDat中的所有其他日期。 此外,您可能要添加寫日期對象 'f.write(東西+ '\ r \ n')' \ r \ n =輸入後進入。 – Azeirah

+0

@azeirah:除非你只想讓你的代碼在Windows上工作,否則不要寫'\ r \ n'。只需編寫'\ n',讓Python的文本/通用換行符模式爲您處理平臺差異問題。 – abarnert

+0

如果你想添加2年,爲什麼不是年= 2而不是天= 731?後者只有在閏年邊界時纔有效。它的可讀性較差 - 你必須停下來思考731天的含義。 – abarnert

回答

0

解決

我給它它的思想的一點(很多)和剛剛一起在一塊。我知道有太多的循環,但現在我明白了。無論如何,感謝你幫助我的人。我留下代碼給任何有類似問題的人。

nowDate = date.today() 

for line in sourceFile: 
    s = re.compile('(\d{2}\/\d{2}\/\d{4})\s(C\d{3}\sS\d{3})') 
    s1 = re.search(s, line) 
    if s1: 
     date = s1.group(1) 
     date = datetime.strptime(date, '%d/%m/%Y') 
     date = date.date() 
     endDate = date + timedelta(days=731) 
     if endDate <= nowDate: 
      fileLst.write(s1.group()) 
      fileLst.write('\n') 
     else: 
      print ('not ready: ', date.strftime('%d-%m-%Y')) 
      ntrdLst.write(s1.group(1)) 
      ntrdLst.write('\n') 
0

你在一個循環結束日期計算,每進行一次約會......但與做任何事情它在循環中。因此,循環結束後,您將擁有最後一個endDate,並且您只使用該日期來決定要寫入哪個文件。

我不知道你的邏輯應該是什麼,但我很確定你想把if語句寫入內部循環。如果你這樣做了,那麼如果你有100個模式匹配和25個日期,那麼你最終會寫2500個字符串 - 一些到一個文件,另一個到另一個文件。那是你想要的嗎?

+0

並非如此,所有的日期都與他們的數字有關,我只是想根據當時的日期將一些文件寫入一個文件,另一些文件寫入另一個文件。如果我有100個具有數字的日期,我想保留100個,但根據它們攜帶的日期分開它們。對不起,如果我誤導了,並感謝你的幫助。 – Miniminion