给定项目编号列表,我试图搜索带有最近项目编号列表的文本文件,并在最近的列表中标识任何项目编号.然后我想添加最近列表中尚未存在的任何项目.
我的代码如下,它似乎没有在文本文件中找到任何内容.为什么不工作?
def filter_recent_items(items): recentitems = [] with open('last 600 items.txt', 'r+') as f: for item in items: if item['ID'] in f: print 'In! --', item['ID'] else: recentitems.append(item['ID']) print 'Out ---', item['ID'] for item in recentitems: f.write("%s\n" % item) items = [ {'ID': 1}, {'ID': 'test2'} ] filter_recent_items(items)
例如,我的文本文件是:
test2 test1 1
但上面的代码返回
Out --- 1 Out --- test2
xgord.. 6
问题在于您如何检查指定文本是否存在.在您的代码中f
是一个文件对象,用于读取和写入文件.它不包含文件的内容.所以,当你检查是否
str in f
它没有检查你的想法.(详见下文.)
相反,您需要读取文件的行,然后遍历这些行并检查必要的字符串.防爆.
with open('last 600 items.txt', 'r+') as f: lines = f.readlines() for l in lines: # check within each line for the presence of the items
在上面的代码exerpt中,f.readlines()
使用文件对象来读取文件的内容并返回字符串列表,这些字符串是文件中的行.
编辑(相信彼得伍德)
Python会员详细信息
在Python中,当您使用语法时x in y
,它会检查两件事:
案例1: 首先检查是否y
有__contains__(b)
方法.如果是,则返回结果y.__contains__(x)
.
案例2:但是,如果y
确实不能有一个__contains__
方法,但确实定义的__iter__
方法,巨蟒,而不是使用该方法在内容迭代y
并返回True
如果在任何点中的一个值上迭代的平等x
.否则,它返回False
.
如果我们使用您的代码作为示例,在某个时刻,它正在检查语句的真实性"test2" in f
.这f
是一个类型的对象file
.(Python文件对象描述).文件对象属于第2种情况(即它们不具备__contains__
,他们也有__iter__
.
因此代码将遍历每一行,看看您的输入字符串是否等于文件中的任何行.由于每一行都以char结尾,因此\n
你的字符串永远不会返回True
.
详细说明,虽然"test2" in "test2\n"
会返回True
,但实际执行的测试是:"test2" == "test2\n"
,即False
.
您可以手动测试其在文件中的工作方式.例如,如果我们想看看是否"test2" in f
应该返回True
:
with open(filename) as f: x = iter(f) while(True): try: line = x.next() except: break print(line) print(line == "test2")
你会注意到它打印出每一行(包括最后的换行符),结果line == "test2"
总是如此False
.
但是,如果我们尝试:"test2\n" in f
,结果将是True
.
结束编辑
问题在于您如何检查指定文本是否存在.在您的代码中f
是一个文件对象,用于读取和写入文件.它不包含文件的内容.所以,当你检查是否
str in f
它没有检查你的想法.(详见下文.)
相反,您需要读取文件的行,然后遍历这些行并检查必要的字符串.防爆.
with open('last 600 items.txt', 'r+') as f: lines = f.readlines() for l in lines: # check within each line for the presence of the items
在上面的代码exerpt中,f.readlines()
使用文件对象来读取文件的内容并返回字符串列表,这些字符串是文件中的行.
编辑(相信彼得伍德)
Python会员详细信息
在Python中,当您使用语法时x in y
,它会检查两件事:
案例1: 首先检查是否y
有__contains__(b)
方法.如果是,则返回结果y.__contains__(x)
.
案例2:但是,如果y
确实不能有一个__contains__
方法,但确实定义的__iter__
方法,巨蟒,而不是使用该方法在内容迭代y
并返回True
如果在任何点中的一个值上迭代的平等x
.否则,它返回False
.
如果我们使用您的代码作为示例,在某个时刻,它正在检查语句的真实性"test2" in f
.这f
是一个类型的对象file
.(Python文件对象描述).文件对象属于第2种情况(即它们不具备__contains__
,他们也有__iter__
.
因此代码将遍历每一行,看看您的输入字符串是否等于文件中的任何行.由于每一行都以char结尾,因此\n
你的字符串永远不会返回True
.
详细说明,虽然"test2" in "test2\n"
会返回True
,但实际执行的测试是:"test2" == "test2\n"
,即False
.
您可以手动测试其在文件中的工作方式.例如,如果我们想看看是否"test2" in f
应该返回True
:
with open(filename) as f: x = iter(f) while(True): try: line = x.next() except: break print(line) print(line == "test2")
你会注意到它打印出每一行(包括最后的换行符),结果line == "test2"
总是如此False
.
但是,如果我们尝试:"test2\n" in f
,结果将是True
.
结束编辑