Построение строк с использованием 2 CSV файлов со словарями

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

Чтобы дать некоторый контекст, у меня есть около 60’000 файлов, которые я пытаюсь реорганизовать. У меня есть 2 CSV-файла, которые я собираюсь использовать.

file1.csv

id |    path       | objectid | image path
 1 | path/to/file1 |   4123   | http://url./image1.jpg
 2 | path/to/file2 |   5111   | http://url./image2.jpg

...(about 60'000 rows)

file2.csv

objectid | categoryid | termid | Description | parent
  4123   |    8302    |  14    |  Category1  |   10
  4123   |    5123    |  66    |  Category2  |   14

Таким образом, второй файл может иметь несколько строк с одним и тем же objectid (в file1 есть только 1 на строку). Это делает доступными подкатегории, которые создаются с помощью parent — > termid. Categoryid — это только идентификатор для имени категории,но Родительский columnn смотрит на termid, чтобы определить его Родительский.

Поэтому я пытаюсь добиться следующего: возьмите путь к файлу из file1.csv, это objectid найти все строки в file2.csv с тем же objectid, отсортировать их на основе родительского номера (ниже идет первым) и добавить каждое из описаний в правильном порядке (отделены с/) на той же строке к существующему пути из file1. В конечном итоге он загрузит изображение из той же строки и переместит его в файловую систему, но я борюсь с тем, чтобы получить вещь, чтобы сделать имена файлов.

Вот код, который у меня есть прямо сейчас:

import csv

main_dict = {}
with open('files1.csv', newline='', encoding='utf-8') as f:
        reader = csv.reader(f)
        for row in reader:
            filepath = row[1]
            objectid = row[2]
            imagepath = "http://url.com" + row[3] + "_0001.jpg"
            key = row[2]
            main_dict[key] = row[1]
        #print(main_dict)

second_dict = {}
with open('file2.csv', newline='', encoding='utf-8') as f:
        reader = csv.reader(f)
        for row in reader:
            key = row[0]
            second_dict[key] = row[3]
        print(second_dict)

for key in main_dict:
    if key in second_dict:
        print(second_dict[key] + '/' + main_dict[key] )

Я мог бы идти в совершенно неправильном направлении с этим, так что любая помощь будет высоко оценена.

P. S Я использую Python3.5

Большое спасибо!

1 ответ

  1. Я думаю, что наиболее эффективным способом достижения этого было бы использование модуля pandas как части экосистемы анализа данных python. Я использую python версии 2.7 для следующего примера кода, чтобы сделать то, что вы просите, так что вы можете попробовать портировать это для python 3.5, но должно быть простым.

    Панды используют внутренние объекты dataframe (показано как’ df ‘ в коде ниже) для хранения табличной информации

    import pandas as pd
    import numpy as np
    
    df1 = pd.read_csv(r"C:\Users\alii\Desktop\stackOF.csv") # file1
    df2 = pd.read_csv(r"C:\Users\alii\Desktop\stackOF2.csv") # file2
    

    df1 выглядит так:

    Введите описание изображения здесь

    df2 выглядит так:

    Введите описание изображения здесь

    df2 = df2.sort(['parent']) # sort by parent
    df1 = df1.set_index(df1.objectid)
    

    df1 выглядит так:
    Введите описание изображения здесь

    df2['path'] = df2.objectid.map(df1.path) #add path for each objectid from file1
    

    df2 выглядит так:
    Введите описание изображения здесь

    s3 = df2.groupby('objectid').apply(lambda x: np.repeat(x['Description'].values, 1).tolist())
    df2 = df2.set_index(df2.objectid)
    df3 = s3.to_frame('Description')
    df3 = df3.reset_index()
    

    df3 (новый объект) выглядит следующим образом:

    Введите описание изображения здесь

    df3['path'] = df3.objectid.map(df2.drop_duplicates('objectid').path)
    

    df3 (новый объект) выглядит следующим образом:
    Введите описание изображения здесь

    df3['Description'] = df3['Description'].apply(lambda x: '/'.join(x))
    

    df3 (новый объект) выглядит следующим образом:
    Введите описание изображения здесь

    df3['Description'] = df3['Description'].astype(str) + str('/') +df3['path'].astype(str)
    df3 = df3.drop('path', 1)
    

    df3 (новый объект) выглядит так (окончательный):

    Введите описание изображения здесь

    df3.to_csv('file3.csv')