0

我正在用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 06/09/2007 A825 B825 06/09/2007 A434 B434 06/05/2010 A826 B826

我想要的是,如果我有一个在 date.today() 之后的日期,比如 27/01/2016 写入另一个文件,而我不断得到的是脚本打印此列表 30 次或不考虑if 语句。

(抱歉,if 确实在最后一个循环中缩进了,我把它放在这里时出错了)

4

2 回答 2

0

解决了

我对它进行了一点(很多)思考,然后将它们拼凑在一起。我知道有太多的 for 循环,但现在我明白了。无论如何,感谢您向我伸出了援助之手。我将代码留给有类似问题的任何人。

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')
于 2013-10-21T04:07:00.977 回答
0

您正在循环中计算 endDate ,每个日期一次......但在循环中不做任何事情。因此,循环结束后,您将拥有最后一个 endDate,并且您仅使用该 endDate 来决定写入哪个文件。

我不确定你的逻辑应该是什么,但我很确定你想把 if 语句和 writes 放在内部循环中。

如果你这样做,那么如果你有 100 个模式匹配和 25 个日期,你最终将写入 2500 个字符串——一些到一个文件,一些到另一个文件。那是你想要的吗?

于 2013-10-19T23:29:41.213 回答