2016-11-15 2 views
-1

Я использую Python 2.7 и SDK v2 EBayможет кто-нибудь объяснить, как я могу вытащить определенные поля из Dict в питоне

У меня есть ДИКТ хранимый и Im писать его в файл CSV (пытаюсь), проблема это я только хочу некоторые поля я не хочу, чтобы выписать каждый столбец

вот мой ДИКТ

{'itemSearchURL': 'http://www.ebay.co.uk/sch/i.html?LH_ItemCondition=1&_nkw=OMP+OD%2F1989&_ddo=1&_ipg=1&_pgn=1', 'paginationOutput': {'totalPages': '187', 'entriesPerPage': '1', 'pageNumber': '1', 'totalEntries': '187'}, 'ack': 'Success', 'timestamp': '2016-11-15T15:52:01.356Z', 'searchResult': {'item': [{'itemId': '322324027874', 'subtitle': '100% GENUINE OMP STEERING WHEEL - NOT A CHEAP FAKE COPY', 'globalId': 'EBAY-GB', 'title': 'OD/1989/NN OMP TRECENTO UNO SPORTS STEERING WHEEL 300mm in BLACK POLYURETHANE', 'country': 'GB', 'primaryCategory': {'categoryId': '40195', 'categoryName': 'Steering Wheels & Boss Kits'}, 'autoPay': 'false', 'galleryURL': 'http://thumbs3.ebaystatic.com/m/miOhEO1pDb2cff4pPcZpwIQ/140.jpg', 'shippingInfo': {'shippingType': 'Free', 'shipToLocations': ['AU', 'Americas', 'Europe', 'Asia'], 'shippingServiceCost': {'_currencyId': 'GBP', 'value': '0.0'}}, 'location': 'United Kingdom', 'topRatedListing': 'false', 'viewItemURL': 'http://www.ebay.co.uk/itm/OD-1989-NN-OMP-TRECENTO-UNO-SPORTS-STEERING-WHEEL-300mm-BLACK-POLYURETHANE-/322324027874', 'sellingStatus': {'currentPrice': {'_currencyId': 'GBP', 'value': '78.28'}, 'timeLeft': 'P25DT0H21M7S', 'convertedCurrentPrice': {'_currencyId': 'GBP', 'value': '78.28'}, 'sellingState': 'Active'}, 'paymentMethod': 'PayPal', 'isMultiVariationListing': 'false', 'condition': {'conditionId': '1000', 'conditionDisplayName': 'New'}, 'listingInfo': {'listingType': 'FixedPrice', 'gift': 'false', 'bestOfferEnabled': 'false', 'startTime': '2016-11-10T16:13:08.000Z', 'buyItNowAvailable': 'false', 'endTime': '2016-12-10T16:13:08.000Z'}}], '_count': '1'}, 'version': '1.13.0'} 

здесь мой раздел кода Thats не работает

def WriteDictToCSV(csv_file,csv_columns,dict_data): 
    try: 
     with open(csv_file, 'w') as csvfile: 
      writer = csv.DictWriter(csvfile, fieldnames=csv_columns) 
      writer.writeheader() 
      for data in dict_data: 
       writer.writerow(data) 
    except IOError as (errno, strerror): 
      print("I/O error({0}): {1}".format(errno, strerror))  
    return    

csv_columns = ['itemId','title','subtitle','viewItemURL'] 


currentPath = os.getcwd() 
csv_file = currentPath + "/csv/items.csv" 

WriteDictToCSV(csv_file,csv_columns,response.dict()) 

это моя ошибка

Traceback (most recent call last): 
     File "/home/richard/workspace/ebay title search by csv/learning2.py", line 56, in <module> 
     WriteDictToCSV(csv_file,csv_columns,response.dict()) 
     File "/home/richard/workspace/ebay title search by csv/learning2.py", line 45, in WriteDictToCSV 
     writer.writerow(data) 
     File "/usr/lib64/python2.7/csv.py", line 148, in writerow 
     return self.writer.writerow(self._dict_to_list(rowdict)) 
     File "/usr/lib64/python2.7/csv.py", line 144, in _dict_to_list 
     ", ".join(wrong_fields)) 
    ValueError: dict contains fields not in fieldnames: i, t, e, m, S, e, a, r, c, h, U, R, L 

Я понимаю, что я не хватает имен столбцов, но на самом деле не знаю, как разобрать биты я хочу из Словаре я был thinkink о преобразовании Dict в XML и использование etree как видно некоторые руководства по сети, как сделать это, но на самом деле хотел бы узнать, как работать с Dict, как это

Я также попытался с цикл, но это просто дал мне ошибки не говоря никакой ценности

for item in response.dict()['searchResult']['item']: 
    print "ItemID: %s" % item['itemId'].value 
    print "Title: %s" % item['title'].value 
    print "CategoryID: %s" % item['primaryCategory']['categoryId'].value 

Я изо всех сил пытаюсь размахивать головой вокруг контейнера

Если я делаю цикл for через dict, я могу видеть ключи и значения.

mydata = response.dict() 
for key, value in mydata.items(): 
    print key, value 

, которые дают мне выход в ключах

Я думал о перечислении их и извлекая один ключ, но читал, что словари не упорядочены так, что выйдет с разными результатами это правда.

ответ

0

Вы итерацию над одного словаря вы прошли в:

for data in dict_data: 
    writer.writerow(data) 

Это проходит в каждом ключа из словаря в отдельной строке; каждая строка должна быть словарем, а модуль csv использует итерацию по строке для проверки дополнительных ключей. Вот почему вы видите каждую отдельную букву с первого ключа (itemSearchURL здесь).

Pass в этом списке словарей погребенных под ['searchResult']['item'] ключей:

WriteDictToCSV(csv_file, csv_columns, response.dict()['searchResult']['item']) 

Теперь dict_data последовательность dict объектов, data будет один из словарей в списке.

Далее эти словари содержат больше ключей чем то, что вы сказали DictWriter экземпляра о, так что вы все равно получите ошибку:

ValueError: dict contains fields not in fieldnames: 'globalId', 'country', 'primaryCategory', 'autoPay', 'galleryURL', 'shippingInfo', 'location', 'topRatedListing', 'sellingStatus', 'paymentMethod', 'isMultiVariationListing', 'condition', 'listingInfo' 

Назовите DictWriter игнорировать их с extrasaction='ignore':

writer = csv.DictWriter(out, fieldnames=csv_columns, extrasaction='ignore') 

Последнее, но не менее важное: вам не нужно выполнять какие-либо из этих циклов; просто использовать writer.writerows() (множественное число, обратите внимание на s в конце), чтобы написать список строк на одном дыхании:

writer = csv.DictWriter(out, fieldnames=csv_columns, extrasaction='ignore') 
writer.writeheader() 
writer.writerows(dict_data) 

Демо:

>>> from cStringIO import StringIO 
>>> import csv 
>>> response_dict = {'itemSearchURL': 'http://www.ebay.co.uk/sch/i.html?LH_ItemCondition=1&_nkw=OMP+OD%2F1989&_ddo=1&_ipg=1&_pgn=1', 'paginationOutput': {'totalPages': '187', 'entriesPerPage': '1', 'pageNumber': '1', 'totalEntries': '187'}, 'ack': 'Success', 'timestamp': '2016-11-15T15:52:01.356Z', 'searchResult': {'item': [{'itemId': '322324027874', 'subtitle': '100% GENUINE OMP STEERING WHEEL - NOT A CHEAP FAKE COPY', 'globalId': 'EBAY-GB', 'title': 'OD/1989/NN OMP TRECENTO UNO SPORTS STEERING WHEEL 300mm in BLACK POLYURETHANE', 'country': 'GB', 'primaryCategory': {'categoryId': '40195', 'categoryName': 'Steering Wheels & Boss Kits'}, 'autoPay': 'false', 'galleryURL': 'http://thumbs3.ebaystatic.com/m/miOhEO1pDb2cff4pPcZpwIQ/140.jpg', 'shippingInfo': {'shippingType': 'Free', 'shipToLocations': ['AU', 'Americas', 'Europe', 'Asia'], 'shippingServiceCost': {'_currencyId': 'GBP', 'value': '0.0'}}, 'location': 'United Kingdom', 'topRatedListing': 'false', 'viewItemURL': 'http://www.ebay.co.uk/itm/OD-1989-NN-OMP-TRECENTO-UNO-SPORTS-STEERING-WHEEL-300mm-BLACK-POLYURETHANE-/322324027874', 'sellingStatus': {'currentPrice': {'_currencyId': 'GBP', 'value': '78.28'}, 'timeLeft': 'P25DT0H21M7S', 'convertedCurrentPrice': {'_currencyId': 'GBP', 'value': '78.28'}, 'sellingState': 'Active'}, 'paymentMethod': 'PayPal', 'isMultiVariationListing': 'false', 'condition': {'conditionId': '1000', 'conditionDisplayName': 'New'}, 'listingInfo': {'listingType': 'FixedPrice', 'gift': 'false', 'bestOfferEnabled': 'false', 'startTime': '2016-11-10T16:13:08.000Z', 'buyItNowAvailable': 'false', 'endTime': '2016-12-10T16:13:08.000Z'}}], '_count': '1'}, 'version': '1.13.0'} 
>>> csv_columns = ['itemId','title','subtitle','viewItemURL'] 
>>> out = StringIO() 
>>> writer = csv.DictWriter(out, fieldnames=csv_columns, extrasaction='ignore') 
>>> writer.writeheader() 
>>> writer.writerows(response_dict['searchResult']['item']) 
>>> print out.getvalue() 
itemId,title,subtitle,viewItemURL 
322324027874,OD/1989/NN OMP TRECENTO UNO SPORTS STEERING WHEEL 300mm in BLACK POLYURETHANE,100% GENUINE OMP STEERING WHEEL - NOT A CHEAP FAKE COPY,http://www.ebay.co.uk/itm/OD-1989-NN-OMP-TRECENTO-UNO-SPORTS-STEERING-WHEEL-300mm-BLACK-POLYURETHANE-/322324027874 
+0

Спасибо за пояснения, что сделало вещи очень ясно, я дам в минуту –

Смежные вопросы