【问题标题】:Building strings using 2 CSV files with dictionaries使用 2 个带有字典的 CSV 文件构建字符串
【发布时间】:2017-05-12 06:09:09
【问题描述】:

我已经为这个任务苦苦挣扎了很长一段时间,在这里我请求一些关于如何解决我的问题的指导。

为了提供一些背景信息,我有大约 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 只是类别名称的 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

非常感谢!

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 on topichow to ask 在这里申请。 Stack Overflow 是针对您的代码的明显问题,而不是推测性的实现帮助。您可能需要 CodeReview.StackExchange.com
  • 这听起来像是一个非常数据库化的解决方案,数据库可能比您读入内存的 csv 文件更好吗?
  • 也许……但是这是一次性的事情,以后我不需要再这样做了……虽然我确实在数据库中有数据……
  • 旁白:请以原始形式发布数据。您的示例使用管道,但您的代码使用默认的逗号分隔符。假设您的数据实际上有逗号,任何想要使用您的示例作为输入的人都必须将它们返回到您最初拥有它们的形式。这也使得您很难知道您是否需要从值中去除空格——是吗?真的在那里,还是您出于某种原因自己添加了它?等等。
  • 是逗号,我只是以它为例,以直观的方式画出数据的样子……

标签: python sorting csv dictionary


【解决方案1】:

我认为最有效的方法是使用 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 看起来像这样:

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(new object) 看起来像这样:

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

df3(new object) 看起来像这样:

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

df3(new object) 看起来像这样:

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

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

df3.to_csv('file3.csv')

【讨论】:

  • 太棒了,谢谢伊姆兰!这绝对解决了这个问题,我将把它输入变量并用它来移动文件。一个问题,我认为解决方案在这一行: df2['Description'] = df2['Description'].astype(str) + str('/') +df2['path'].astype(str) .它只需要 2 个参数而不是所有参数。如果您在第二个文件中使用查找 objectid 它将返回超过 2 个类别,通常是 4-5,并且应该使用那些 - 最低的第一个和最高的构建路径。这可能吗?
  • 请接受我的回答,如果可以接受,请点赞。 df2['Description'] = df2['Description'].astype(str) + str('/') +df2['path'].astype(str) 行用于连接您需要的文件路径。当然,您可以为多个条目执行此操作 df2['Description'] = df2['Description'].astype(str) + str('/') +df2['path'].astype(str) + str('/') +df2['somefield'].astype(str) 以这种方式
  • 我认为我的评论在阅读时有点令人困惑。对于相同的 objectid,有多个行,因此有多个描述。见这张图片:imgur.com/a/P0Pmq。因此,使用 objectid: 100182 它应该返回 Car/3D Car Models/Truck and Heavy Vehicle/Production/International Truck/ 的路径,希望这不会令人困惑……
  • @kokozz - 我对上面的答案进行了更改。您的问题对于您在 description 列中的期望并不完全清楚。这应该为您提供您正在寻找的信息
  • 太棒了。这很完美。我设法使用 mysql 查询实现了类似的方式,但它仍然需要一些工作。无论哪种方式,非常感谢你的帮助 canuck :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 2018-09-29
  • 2021-03-04
相关资源
最近更新 更多