【发布时间】:2013-10-19 22:56:19
【问题描述】:
我正在用 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,如果不是,到文件名。
我的问题是它多次写入同一个列表 (i) 并且不进行排序。
我对 python 和编程非常陌生,所以我请求你的帮助。提前谢谢
编辑:-----------------
正常的输出是这样的(没有日期和 if 语句)
27/01/2009 A448 B448 2001 年 10 月 22 日 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确实在最后一个循环中缩进了,我放在这里出错了)
【问题讨论】:
-
for语句最后4行的缩进不就是小问题吗? endDate 变量一直在变化,但是直到嵌套 for 的最后一次迭代时才会发生任何事情,然后它会进行写入。因此,您忽略了 findDat 中的所有其他日期。此外,您可能希望在写入日期对象
f.write(something + '\r\n')\r\n = enter 后添加回车。 -
@azeirah:除非您只希望代码在 Windows 上运行,否则不要写 '\r\n'。只需写 '\n' 并让 Python 的 text/universal-newlines 模式为您处理平台差异。
-
如果你想加2年,为什么不用years=2而不是days=731呢?后者仅在您处于闰年边界时才有效。而且它的可读性较差——你必须停下来想想 731 天意味着什么。
-
最后,您能否给我们一个小样本输入并告诉我们预期和实际输出,而不是让我们猜测您想要什么?
标签: python regex loops if-statement for-loop