Python конвертировать словарь в CSV - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь преобразовать словарь в CSV, чтобы он был читабелен (в соответствующем ключе).

import csv
import json
from urllib.request import urlopen
x =0
id_num = [848649491, 883560475, 431495539, 883481767, 851341658, 42842466, 173114302, 900616370, 1042383097, 859872672]
for bilangan in id_num:

with urlopen("https://shopee.com.my/api/v2/item/get?itemid="+str(bilangan)+"&shopid=1883827")as response:
    source = response.read()

data = json.loads(source)
#print(json.dumps(data, indent=2))


data_list ={ x:{'title':productName(),'price':price(),'description':description(),'preorder':checkPreorder(),
             'estimate delivery':estimateDelivery(),'variation': variation(), 'category':categories(),
             'brand':brand(),'image':image_link()}}

#print(data_list[x])
x =+ 1

Я храню данные в x, поэтому они будут циклически изменяться от 0 до 1, 2 и т. Д. Я перепробовал много вещей, но все еще не могу найти способ заставить их выглядеть так или близко к этому:

https://i.stack.imgur.com/WoOpe.jpg

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

Я думаю, может быть, вы просто хотите объединить несколько ячеек, как Excel? Если да, я думаю, что это невозможно в CSV, потому что формат CSV не содержит информацию о стиле ячейки, как Excel. Некоторые возможные решения:

  1. используйте openpyxl для генерации файла Excel вместо csv, затем вы можете объединить ячейки с помощью функции "worksheet.merge_cells ()".
  2. не пытайтесь объединять ячейки, просто сохраняйте заголовок, цену и другие поля для каждой строки, формат данных должен быть таким:

    первая строка: {'title': 'test_title', 'price': 22, 'image': 'image_link_1'}

    вторая строка: {'title': 'test_title', 'price': 22, 'image': 'image_link_2'}

  3. не пытайтесь объединить ячейки, но задайте для заголовка, цены и других полей пустую строку, чтобы она не отображалась в вашем CSV-файле.

  4. использовать разрыв строки для управления форматом, который объединит несколько строк с одинаковым заголовком в одну строку.

надеюсь, это поможет.

0 голосов
/ 01 июля 2018

На вашем месте я бы сделал это немного по-другому. Мне не нравится, что вы вызываете так много функций, в то время как этот сайт предлагает прекрасный ответ JSON :) Более того, я буду использовать библиотеку pandas, чтобы иметь полный контроль над своими данными. Я не любитель CSV. Это глупый прототип:

import requests
import pandas as pd

# Create our dictionary with our items lists

data_list = {'title':[],'price':[],'description':[],'preorder':[],
             'estimate delivery':[],'variation': [], 'categories':[],
             'brand':[],'image':[]}

# API url
url ='https://shopee.com.my/api/v2/item/get' 

id_nums = [848649491, 883560475, 431495539, 883481767, 851341658,
          42842466, 173114302, 900616370, 1042383097, 859872672]
shop_id = 1883827

# Loop throw id_nums and return the goodies
for id_num in id_nums:
    params = {
         'itemid': id_num, # take values from id_nums 
        'shopid':shop_id}
    r = requests.get(url, params=params)

    # Check if we got something :)
    if r.ok:
        data_json = r.json()

        # This web site returns a beautiful JSON we can slice :)

        product = data_json['item']

        # Lets populate our data_list with the items we got. We could simply
        # creating one function to do this, but for now this will do
        data_list['title'].append(product['name'])
        data_list['price'].append(product['price'])
        data_list['description'].append(product['description'])
        data_list['preorder'].append(product['is_pre_order'])
        data_list['estimate delivery'].append(product['estimated_days'])
        data_list['variation'].append(product['tier_variations'])
        data_list['categories'].append([product['categories'][i]['display_name'] for i, _ in enumerate(product['categories'])])
        data_list['brand'].append(product['brand'])
        data_list['image'].append(product['image'])

    else:
            # Do something if we hit connection error or something.
            # may be retry or ignore
            pass



# Putting dictionary to a list and ordering :)
df = pd.DataFrame(data_list)
df = df[['title','price','description','preorder','estimate delivery',
         'variation', 'categories','brand','image']]

# df.to ...? There are dozen of different ways to store your data 
# that are far better than CSV, e.g. MongoDB, HD5 or compressed pickle

df.to_csv('my_data.csv', sep = ';', encoding='utf-8', index=False)
0 голосов
/ 01 июля 2018

Использование DictWriter из модуля csv

Демо:

import csv

data_list ={'x':{'title':'productName()','price':'price()','description':'description()','preorder':'checkPreorder()',
             'estimate delivery':'estimateDelivery()','variation': 'variation()', 'category':'categories()',
             'brand':'brand()','image':'image_link()'}}

with open(filename, "w") as infile:
    writer = csv.DictWriter(infile, fieldnames=data_list["x"].keys())
    writer.writeheader()
    writer.writerow(data_list["x"])
...