我正在尝试编写一个从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年11月21日 无效日期12月7日,1862年 无效日期为13 4,2000 无效日期11 40,1460 无效日期1970年7月7日 无效日期为2001年8月31日 无效日期6月26日,1800日 无效日期3 32,400 无效日期1 1,111 无效
答案 0 :(得分: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,您可能需要显式打开和关闭文件(通过文件对文件中的行进行简单的隐式迭代:)或在文件上添加更明确的迭代(< em> f.readline()或 f.readlines()(复数)取决于您是否要在整个文件中“啜饮”(具有内存开销的含义)或逐行迭代。
另请注意,您可能希望从这些文件内容中删除尾随换行符(可能是通过调用 line.rstrip('\ n') ---或者可能只是 line.strip ()如果你想从每一行中消除所有前导和尾随空格。)
(根据对上一个答案的附加评论进行编辑):
函数签名 isValid(m,d,y)表示您将数据传递给此函数(月,日,年),但这是没有意义的,因为您必须还有,不知何故,传递要验证的数据(文本行,字符串等)。
为了进一步帮助您,您必须提供更多信息(最好是来源或相关部分来源于此“isValid()”函数。
在我最初的回答中,我假设你的“isValid()”函数只是在其单个参数中扫描任何有效日期。我修改了我的代码示例,以显示如何将特定日期作为单个参数传递给使用此调用签名的函数:“isValid(somedata,some_date)。”
答案 1 :(得分:1)
with open(fname) as f:
for line in f.readlines():
test(line)