使用带有词典的2个CSV文件构建字符串

时间:2016-12-28 00:34:53

标签: python sorting csv dictionary

我已经在这项任务中苦苦挣扎了一段时间,在这里我要求就如何处理我的问题提供一些指导。

为了给出一些背景信息,我有大约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个)。这使得子类别可用,使用父级创建 - > termid。 Categoryid只是类别名称的id,但父列正在查看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 个答案:

答案 0 :(得分:0)

我认为实现这一目标的最有效方法是使用pandas模块作为python数据分析生态系统的一部分。我使用python版本2.7进行以下代码示例来执行您要求的操作,因此您可以尝试将此端口用于python 3.5,但应该很简单。

Pandas使用内部数据框(在下面的代码中显示为'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如下所示:

enter image description here

df2如下所示:

enter image description here

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

df1如下所示: enter image description here

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

df2看起来像这样: enter image description here

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(新对象)如下所示:

enter image description here

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

df3(新对象)如下所示: enter image description here

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

df3(新对象)如下所示: enter image description here

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

df3(新对象)看起来像这样(最终):

enter image description here

df3.to_csv('file3.csv')