【问题标题】:Searching and sorting in Python在 Python 中搜索和排序
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 并非如此,所有日期都与它们的数字有关,我只想根据那里的日期将一些日期写入一个文件,将其他日期写入另一个文件。如果我有 100 个带数字的日期,我想保留 100 个,但根据它们携带的日期将它们分开。如果我误导了我,我很抱歉,感谢您的帮助。
【解决方案2】:

已解决

我对它进行了一点(很多)思考,然后将所有内容整合在一起。我知道有太多的 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')

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2015-08-13
    • 2015-02-14
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多