2015-12-19 143 views
0

我正在嘗試篩選已經搜索出的項目列表。我目前的代碼在下面;無論「上次搜索items.txt」中的內容如何,​​它都不會過濾掉任何項目。Python文本文件搜索和更新

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 

功能輸入,物品,是類型的字典列表(每個項目都有一組鍵):

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將包含此功能已運行後, itemids的列表,如:

151921257466 
252218618062 
201487509183 
291642436891 
272081891024 

功能應該打開「最後的搜索items.txt」,它應該包含項目ID列表(從以前的搜索)。對於函數輸入中的每個項目,它會查看'itemid'是否已經在文本文件中。如果不是,則會將該項目詞典附加到函數輸出。完成此操作後,它將清除文本文件,並從「項目」中重寫項目id,準備下次調用此函數。

我的問題是它沒有在文本文件中找到'itemid',即使它實際上在那裏(不會拋出任何錯誤消息,只是追加'items'的全部內容來輸出)。在Windows上編輯和測試時它工作正常。我已經把它上傳到了一個unix VPS,它不起作用,稍微編輯了它,現在它似乎無論在windows還是unix上都能正常工作!

第二個問題是,是否有更優雅的方式可以過濾(dicts)項目列表以僅返回腳本運行時不在列表中的結果?

+0

你可以給出a)關於錯誤的具體回溯,以及b)「最後搜索items.txt」內容中可能出現的內容的示例。 – train1855

+0

我編輯了原帖 – Testy8

回答

0

問題出在您將當前搜索的ID寫入文件的行中。通過在佔位符和換行符之間放置一個空格,將該空格寫入文本文件(即文本文件的第一行應該是'151921257466'),這意味着當文本文件的內容被讀出時,那個空間出現在你正在比較當前搜索的ID的項目中 - 這意味着它不匹配當前搜索的ID,而不管它是否應該(因爲你正在比較的內容有一個額外的空間,將使它不匹配)。將f.write("%s \n" % item['id'])更改爲f.write(item['id'] + "\n")應該可以在Windows上運行 - 我沒有可用的Unix操作系統進行測試,所以如果這樣做不能在Unix上運行,我不能協助。

+0

我編輯了帖子,使其更清晰一些,輸入'items'實際上是一個dicts列表(每個項目是一個字典),所以item ['id']應該,正確地返回 - 它只是沒有找到'線' – Testy8