我正在尝试从现有项目列表中搜索过的过滤项目。我目前的代码如下;无论'last search items.txt'中的内容是什么,它似乎都不会过滤任何项目。
def filter_recent_items(items):
#Clarify item results - only return if it wasn't run in the last search.
#Clears & rewrites items to .txt file after each search
newitems = []
with open('last search items.txt', 'r+') as f:
lines = f.read().split('\n')
print lines
for item in items:
if item['id'] in lines:
pass
else:
newitems.append(item)
f.seek(0)
f.truncate()
for item in items:
f.write("%s \n" % item['id'])
return newitems
函数input,items,是一个dicts列表(每个项目都有一组键):
items = [{'count': 1, 'postage': '0.0', 'listing type': 'StoreInventory', 'title': 'APPLE IPAD AIR 2 WITH RETINA DISPLAY 128GB SPACE GREY UNLOCKED 4G/WIFI', 'price': '828.89', 'start time': '2015-12-19T12:01:19.000Z', 'end time': '2016-01-18T12:06:19.000Z', 'item url': 'http://www.ebay.com.au/itm/APPLE-IPAD-AIR-2-RETINA-DISPLAY-128GB-SPACE-GREY-UNLOCKED-4G-WIFI-/151921257466', 'category': 'iPads, Tablets & eReaders', 'id': '151921257466', 'condition': '3000'},
{'count': 2, 'postage': '13.4', 'listing type': 'FixedPrice', 'title': 'Samsung SM-P350NZAAXSA Galaxy Tab A 8.0 w/S Pen WiFi 16GB NEW', 'price': '340.0', 'start time': '2015-12-19T11:56:51.000Z', 'end time': '2015-12-29T11:56:51.000Z', 'item url': 'http://www.ebay.com.au/itm/Samsung-SM-P350NZAAXSA-Galaxy-Tab-8-0-w-S-Pen-WiFi-16GB-NEW-/252218618062', 'category': 'iPads, Tablets & eReaders', 'id': '252218618062', 'condition': '1000'}]
最后一次搜索items.txt将在运行此函数后包含一个itemid列表,例如:
151921257466
252218618062
201487509183
291642436891
272081891024
该函数应该打开'last search items.txt',它应该包含一个项目ID列表(来自之前的搜索)。对于函数输入中的每个项目,它将查看“itemid”是否已存在于文本文件中。如果没有,它会将项目dict附加到函数输出。完成此操作后,它将清除文本文件并从“项目”中重写项目ID,以备下次调用此函数时使用。
我的问题是它没有在文本文件中找到'itemid',即使它实际上在那里(不会抛出任何错误消息,只是将'items'的全部内容附加到输出)。在Windows上编辑和测试时工作正常。我已经将它上传到unix VPS,它不能正常工作,稍微编辑一下,现在它似乎既不适用于Windows也不适用于unix!
第二个问题是,是否有更优雅的方式我可以过滤项目列表(dicts),只返回上次运行脚本时不在列表中的结果?
答案 0 :(得分:0)
问题在于您将当前搜索中的ID写入文件。通过在占位符和换行符之间放置一个空格,该空间将被写入文本文件(即文本文件的第一行将是,例如,' 151921257466'),这意味着当读出文本文件,该空间出现在您将当前搜索的ID与之比较的项目中 - 这意味着它与当前搜索的ID不匹配,无论它是否应该(因为你所比较的东西中有一个额外的空间会使它不匹配)。将f.write("%s \n" % item['id'])
更改为f.write(item['id'] + "\n")
应该可以在Windows上运行 - 我没有可用于测试它的Unix操作系统,所以如果它不能在Unix上运行,遗憾的是我无法提供帮助。