2016-12-28 51 views
0

我一直在爲這個任務苦苦掙扎了很長時間,在這裏我正在尋求一些關於如何解決我的問題的指導。使用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%行)多行。這使得使用父 - > termid創建的子類可用。 Categoryid只是該類別名稱的標識,但父級字段正在查看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

非常感謝!

+0

歡迎StackOverflow上。請閱讀並遵守幫助文檔中的發佈準則。 [在主題](http://stackoverflow.com/help/on-topic)和[如何提問](http://stackoverflow.com/help/how-to-ask)適用於此處。堆棧溢出是針對您的代碼可證明的問題,而不是推測性的實施幫助。你可能想CodeReview.StackExchange.com – Prune

+0

這聽起來像一個非常數據庫的解決方案,可能數據庫比你讀入內存的csv文件更好的選擇? –

+0

也許......但是這是一次性的事情,稍後我不需要再做這件事......我確實有數據庫中的數據,儘管... – kokozz

回答

0

我認爲最有效的方法是使用熊貓模塊作爲python數據分析生態系統的一部分。我在下面的代碼示例中使用了python 2.7版本來執行你所要求的操作,所以你可以嘗試移植python 3.5,但應該很簡單。

熊貓使用內部數據幀(在下文中碼示爲 '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(新目標)廁所KS這樣的:

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') 
+0

太棒了,謝謝Imran!這肯定解決了這個問題,我將把它傳遞給變量並用它來移動文件。儘管我有一個問題,我認爲解決方案是在這一行:df2 ['Description'] = df2 ['Description']。astype(str)+ str('/')+ df2 ['path']。astype(str) 。它只需要2個參數,而不是全部。如果在第二個文件中使用查找objectid,它將返回兩個以上的類別,通常是4-5,並且路徑應該使用那些從最低到最高的構造。那可能嗎? – kokozz

+0

請接受我的答案,並且如果可以接受的話,也是upvote。行** 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)**這種方式 – Imran

+0

我覺得我的評論有點令人困惑,因爲我正在閱讀它。對於同一個目標,有多行,因此有多個描述。看到這個圖像:http://imgur.com/a/P0Pmq。所以對於objectid:100182,它應該返回Car/3D Car Models/Truck和Heavy Vehicle/Production/International Truck/希望這不會讓人困惑...... – kokozz