Popis problému

Prestavte si, že potrebujete spracovať dáta napríklad z eshopu. Ako väčšina eshopov sú v nich produkty kategorizované do jednej až viacerých kategórií, kedy jeden produkt, môže byť vo viacerých kategóriách
Priklad: Muffin je v kategoriach Sladke, Balene pecivo, Pekaren a cukraren
V databaze vsak data su v normalizovanej podobe, kedy vyzeraju ako v csv subore categories.csv. Aby sme si vsak vedeli vygenerovat celu cestu, do akej produkt patri, cize Pekaren a cukraren > Balene pecivo > Sladke je potrebne spustit rekurzivny skript.

In [1]:
import pandas as pd
import csv
import os, glob
import sys
In [2]:
data = pd.read_csv("http://margetova.eu/digitalacademy/categories.csv")
new_data = data[['id', 'name', 'parent_id']].copy()
In [3]:
new_data.head()
Out[3]:
id name parent_id
0 300102026 Bylinky a koření 300102000
1 300102000 Ovoce a zelenina 0
2 300102027 Řezané 300102026
3 300102001 Ovoce 300102000
4 300102039 Bio ovoce 300102001
In [4]:
new_data.to_csv('csv/categories_updated.csv', encoding="utf-8", index=False)
In [5]:
listOfFiles = glob.glob("csv/categories_updated.csv")
#zoznam idciek
ids = []
#zoznam parent idciek
parent_ids = []
category_names = []
final_list = []
final_paths = []
path = ""
In [6]:
for fileName in listOfFiles:
    for index, fileInList in enumerate(listOfFiles):
        with open(fileInList, 'r', encoding='utf-8') as f:
            content = csv.reader(f)
            for index_row, data_in_row in enumerate(content):
                for index_col, data_in_cell in enumerate(data_in_row):
                    #preskocenie hlavicky
                    if index_row != 0:
                        """nacivanie vsetkych mien kategorii a ich ulozenie do pola
                        category_names"""
                        if index_col == 1:
                            category_names.append(data_in_row[1])
                        elif index_col == 2:
                            """nacitanie vsetkych parent ids
                            a ich ulozenie do pola
                            parent_ids
                            """
                            parent_ids.append(data_in_row[2])
                        elif index_col == 0:
                            """
                            nacitanie vsetkych id a ich ulozenie do pola ids
                            """
                            ids.append(data_in_row[0])
                        else:
                            pass
f.close()
In [7]:
#nastavenie indexu na 0
index = 0
with open('csv/out_categories.csv', 'w',  encoding='utf-8') as fp:
    #nastavenie zapisu do noveho suboru, cez QUOTE_ALL vsetko ulozime ako string
    a = csv.writer(fp, quoting=csv.QUOTE_ALL)
    #vytvorenie hlavicky csv subory category_list
    a.writerow(['category_id', 'category_path'])
    #prechod polom ideciek
    for j in ids:
        parent_id = parent_ids[index]
        path = category_names[index]
        #prechadzame polom parent_id dokym nie je hodnota 0
        while parent_id != "0":
            index2 = ids.index(parent_id)
            path  = category_names[index2] + "/" + path
            parent_id = parent_ids[index2]
        path = path
        a.writerow([ids[index], path])
        index += 1
        #a.writerow([path])

print ("-----Conversion is done-----")
fp.close()
-----Conversion is done-----