2016-12-14 62 views
1

創建CSV文件,個性化的陣列我有兩個CSV文件是這樣的:如何在Python

source,target 
48,77 
63,48 
77,48 
77,108 
108,48 
306,48 

IDs,acronym,color,coord 
48,MB,FF64FF,"[[308, 156, 268]]" 
63,DMX,FFB3D9,"[[496, 208, 240]]" 
77,SLD,FFC395,"[[404, 180, 200]]" 
108,LSc,90CBED,"[[168, 164, 252]]" 
306,SSp-ul5,188064,"[[160, 84, 312]]" 

我需要這些數據轉換成特定的陣列

「邊緣「應該使來自第一個CSV文件的」源「和」目標「之間的數據變得簡單,因此:

Edges = [(48, 77), (63, 48), (77, 48), (77, 108), (108, 48), (306, 48)] 

「標籤」應該包含「的縮寫」的數據來自根據該情況,第二個CSV文件:

labels = [u'MB', u'DMX', u'SLD', u'LSc', u'SSp-ul5'] 

注:應該有一個「U」旁邊的每個縮寫

「組」我認爲是容易使用.append從‘’中的第二CSV文件

group = [FF64FF, FFB3D9, FFC395, 90CBED, 188064] 

各列的值的列‘中的第二CSV文件座標’應當在三個陣列被劃分XN顏色, Yn和Zn與各個值除以100但保持小數:

Xn = [3.08, 4.96, 4.04, 1.68, 1.60] 
Yn = [1.56, 2.08, 1.80, 1.64, 0.84] 
Zn = [2.68, 2.40, 2.00, 2.52, 3.12] 

我認爲這可與使用迴歸表達式來完成「[[|]]」,並通過使用逗號

分離的值最後使用數據包含在Xn,Yn,Zn和邊緣創建Xe,Ye和Ze。 「Edges」中的第一個元素是(48,77),它對應於第一個和第三個ID(第二個CSV文件的第一列),因此,「Edges」上第一個元素的Xe應該是(Xn [0], XN [2],無),這等於[3.08,4.04,無],所以對於所有的邊和協調XN,YN,鋅我將有:

Xe = [3.08, 4.04, None, 4.96, 3.08, None, 4.04, 3.08, None, 4.04, 1.68, None, 1.68, 3.08, None, 1.60, 3.08, None] 
Ye = [1.56, 1.80, None, 2.08, 1.56, None, 1.80, 1.56, None, 1.80, 1.64, None, 1.64, 1.56, None, 0.84, 1.56, None] 
Ze = [2.68, 2.00, None, 2.40, 2.68, None, 2.00, 2.68, None, 2.00, 2.52, None, 2.52, 2.68, None, 3.12, 2.68, None] 

如果你能幫助我,我真的會欣賞它! 乾杯!

+0

你正在建設一個圖形,但是你爲什麼要使用這樣一個不尋常的格式? – James

回答

2
import csv 
import ast 

with open('1.csv', newline='') as csv1: 
    reader1 = csv.reader(csv1) 
    field1 = next(reader1) 
    Edges = [tuple(i)for i in reader1] 
    print('Edges:', Edges) 

with open('2.csv', newline='') as csv2: 
    reader2 = csv.reader(csv2) 
    field2 = next(reader2) 
    data = [list(i)for i in zip(*reader2)] 
    _, labels, group, coord = data 
    coord = [ast.literal_eval(i)[0]for i in coord] 
    X, Y, Z = [list(i)for i in zip(*coord)] 
    Xn = [i/100for i in X] 
    Yn = [i/100for i in Y] 
    Zn = [i/100for i in Z] 
    print('lables:', labels) 
    print('group:', group) 
    print(Xn, Yn, Zn, sep='\n') 

出來:

Edges: [('48', '77'), ('63', '48'), ('77', '48'), ('77', '108'), ('108', '48'), ('306', '48')] 
lables: ['MB', 'DMX', 'SLD', 'LSc', 'SSp-ul5'] 
group: ['FF64FF', 'FFB3D9', 'FFC395', '90CBED', '188064'] 
[3.08, 4.96, 4.04, 1.68, 1.6] 
[1.56, 2.08, 1.8, 1.64, 0.84] 
[2.68, 2.4, 2.0, 2.52, 3.12] 
+0

酷謝謝!但是當我在我的電腦XN運行代碼,Yn和Zn是整數,我怎樣才能保存兩位小數,並且可以在'標籤'中的元素旁邊保留'u',最後我編輯了Xe,Ye和澤。你認爲你可以幫助我嗎?歡呼和感謝! –

+0

'u'表示unicode,在Python3中,默認情況下字符串是unicode,不需要添加'u'作爲前綴。 –

0

您應該使用.split()方法解析csv文件。

例如:

l = [] 

for line in lines: #lines = result of reading .csv file 
    l.append(line.split(",") 

這將返回一個包含所有數據的表。

如果你想獲得第三行第四列,你會做:

l[3][4] 

每列的第一個值包含列名,所以你應該開始索引1

解析對於最後一步,您必須將列表中的字符串轉換爲:

  • 刪除「[[」和「]]」形成str。
  • 將字符串拆分爲「,」 - > str。分裂( 「」)
  • 使用,在每個創建的列表,相同的索引取通訊員值
1

其他人都在這裏涵蓋了大部分的答案,所以我不會重寫他們的代碼。 相反,我只是給你的結構得到終端:

  1. 清潔和收集的信息被其他人作爲給予的名單: 源 - 目標對列表,ID列表,列表中的首字母縮寫,顏色列表,x列表,y列表,z列表。

  2. 要構建最後的列表,只需查看您的id列表,匹配源 - 目標對。事情是這樣的:

    def find_location(id_list, sample_id): 
        for id_loc in xrange(len(id_list)): 
         if id_list[id_loc] == sample_id: 
          return id_loc 
    def return_locations(source_destination_list): 
        locations = [[find_location(item) for item in pair] for pair in source_destination_list] 
        return locations 
    

那你用在那些ID_LIST位置(或位置),以輸出你的X,Y和Z(因爲他們會在自己的列表中的相同位置。 添加「無」,並把一切都爲單列表應之後是蛋糕。