1

我正在尝试编写一个从 infile 读取每一行的 Python 程序。这个 infile 是一个日期列表。我想用函数 isValid() 测试每一行,如果日期有效则返回 true,否则返回 false。如果日期有效,则将其写入输出文件。如果不是,则将无效写入输出文件。我有这个功能,我只想知道用这个功能测试每一行的最佳方法。我知道这应该通过循环来完成,我只是不确定如何设置循环来逐一测试文件中的每一行。

编辑:我现在有一个基本上可以工作的程序。但是,我在输出文件中得到了不正确的输出。也许有人能够解释原因。

好的,我现在有一个基本上可以运行的程序,但是我在输出文件中得到了奇怪的结果。希望有 Python 3 经验的人可以提供帮助。

   def main():
datefile = input("Enter filename: ")
t = open(datefile, "r")
c = t.readlines()
ofile = input("Enter filename: ")
o = open(ofile, "w")



for line in c:
    b = line.split("/")
    e = b[0]
    f = b[1]
    g = b[2]

    text = str(e) + " " + str(f) + ", " + str(g)
    text2 = "The date " + text + " is invalid"

    if isValid(e,f,g) == True:
        o.write(text)

    else:
        o.write(text2)



def isValid(m, d, y):
if m == 1 or m == 3 or m == 5 or m == 7 or m == 8 or m == 10 or m == 12:
    if d is range(1, 31):
        return True
elif m == 2:
    if d is range(1,28):
        return True
elif m == 4 or m == 6 or m == 9 or m == 11:
    if d is range(1,30):
        return True
else:
    return False

这是我得到的输出。

1998年5月19日无效 1984年7月21日无效 12月7日 1862年无效 2000年13月4日无效 11月40日 1460年无效 1970年5月7日无效 2001年8月31日无效date 6 26, 1800 无效 date 3 32, 400 无效 date 1 1, 1111 无效

4

2 回答 2

2

在最新版本的 Python 中,您可以使用文件隐含的上下文管理功能:

results = list()
with open(some_file) as f:
    for line in f:
        if isValid(line, date):
            results.append(line)

...或者更简洁地使用列表理解:

with open(some_file) as f:
    results = [line for line in f if isValid(line, date)]

对于逐渐较旧的 Python 版本,您可能需要显式打开和关闭文件(对文件进行简单的隐式迭代for line in file:)或在文件上添加更显式的迭代(f.readline()f.readlines()(复数)取决于您是要在整个文件中“啜饮”(具有内存开销的影响)还是逐行迭代)。

另请注意,您可能希望从这些文件内容中去除尾随换行符(可能通过调用line.rstrip('\n') --- 或者如果您想消除所有前导和尾随空格,则可能只调用 line.strip()每一行)。

(根据对先前答案的附加评论进行编辑):

函数签名isValid(m,d,y)表明您正在将数据传递给此函数(月、日、年),但这没有任何意义,因为您还必须以某种方式将数据传递给已验证(一行文本、一个字符串等)。

为了进一步帮助您,您必须提供更多信息(最好是此“isValid()”函数的源代码或源代码的相关部分。

在我最初的回答中,我假设您的“isValid()”函数只是在其单个参数中扫描任何有效日期。我修改了我的代码示例,以展示如何将特定日期作为单个参数传递给使用此调用签名的函数:“isValid(somedata, some_date)”。

于 2013-04-07T21:50:31.713 回答
1
with open(fname) as f:
    for line in f.readlines():
        test(line)
于 2013-04-07T21:36:06.143 回答