2012-06-29 59 views
1

我有一個excel文件,我想讀取每一列併爲它們創建單獨的列表。然後,我想將每個列表中的每個元素與其他相應的列表進行比較。 有沒有一種方法可以將列轉換爲使用Python的列表?使用python將文件中的列轉換爲單獨列表

爲如(我能得到這個文件作爲一個txt空格分隔文件或Excel文件)

HST_9578_02_ACS_WFC_F775W 245.8976441 -26.5255957 4339.570 1882.364 
HST_10615_03_ACS_WFC_F435W 245.8976450 -26.5255138 2084.978 2101.122 
HST_10120_02_ACS_WFC_F658N 245.8976758 -26.5255024 1778.055 1752.193 
HST_10775_64_ACS_WFC_F606W 245.8977532 -26.5255296 2586.612 2603.519 
HST_10775_64_ACS_WFC_F814W 245.8977532 -26.5255296 2586.612 2603.519 
HST_9578_02_ACS_WFC_F775W 245.8978148 -26.5255491 4328.571 1885.712 
HST_10120_02_ACS_WFC_F625W 245.8978053 -26.5254741 1769.711 1754.229 
HST_10353_02_ACS_WFC_F435W 245.8976003 -26.5257784 3758.430 985.125 
HST_10775_64_ACS_WFC_F606W 245.8979115 -26.5254936 2576.410 2606.114 

回答

3

這聽起來像Python的CSV module工作。每行讀取都以字符串列表形式返回。

要從文檔借短的例子:

從CSV文件中讀取每一行返回一個字符串列表。否 執行自動數據類型轉換。

簡短的用法例如:

[這只是打印出每行]

import csv 
with open('some.csv', 'rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     print row 

你可以通過索引與索引值相應的行獲得到特定的列。

或者,如果你想這樣做 「手動」(每行由,分隔):

s = """HST_9578_02_ACS_WFC_F775W 245.8976441 -26.5255957 4339.570 1882.364, 
HST_10615_03_ACS_WFC_F435W 245.8976450 -26.5255138 2084.978 2101.122, 
HST_10120_02_ACS_WFC_F658N 245.8976758 -26.5255024 1778.055 1752.193, 
HST_10775_64_ACS_WFC_F606W 245.8977532 -26.5255296 2586.612 2603.519, 
HST_10775_64_ACS_WFC_F814W 245.8977532 -26.5255296 2586.612 2603.519, 
HST_9578_02_ACS_WFC_F775W 245.8978148 -26.5255491 4328.571 1885.712, 
HST_10120_02_ACS_WFC_F625W 245.8978053 -26.5254741 1769.711 1754.229, 
HST_10353_02_ACS_WFC_F435W 245.8976003 -26.5257784 3758.430 985.125, 
HST_10775_64_ACS_WFC_F606W 245.8979115 -26.5254936 2576.410 2606.114 
""" 

bl = [[],[],[],[],[]] 
for r in s.split(','): 
    for c in range(5): 
     bl[c].append(r.split()[c]) 

給出:

bl[0] 
['HST_9578_02_ACS_WFC_F775W', 'HST_10615_03_ACS_WFC_F435W', 'HST_10120_02_ACS_WFC_F658N', 'HST_10775_64_ACS_WFC_F606W', 'HST_10775_64_ACS_WFC_F814W', 'HST_9578_02_ACS_WFC_F775W', 'HST_10120_02_ACS_WFC_F625W', 'HST_10353_02_ACS_WFC_F435W', 'HST_10775_64_ACS_WFC_F606W'] 

bl[1] 
['245.8976441', '245.897645', '245.8976758', '245.8977532', '245.8977532', '245.8978148', '245.8978053', '245.8976003', '245.8979115'] 

bl[2] 
['-26.5255957', '-26.5255138', '-26.5255024', '-26.5255296', '-26.5255296', '-26.5255491', '-26.5254741', '-26.5257784', '-26.5254936'] 

bl[3] 
['4339.57', '2084.978', '1778.055', '2586.612', '2586.612', '4328.571', '1769.711', '3758.43', '2576.41'] 

bl[4] 
['1882.364', '2101.122', '1752.193', '2603.519', '2603.519', '1885.712', '1754.229', '985.125', '2606.114'] 

編輯/ UPDATE

將兩種方法合併爲一種:

import csv 

with open('so.csv') as f: 
    bl = [[],[],[],[],[]] 
    reader = csv.reader(f) 
    for row in reader: 
     for col in range(5): 
      bl[col].append(row[col]) 

使用with打開文件的優點是,當您完成或發生異常時,它將自動關閉。

+0

如果我的輸入文件(替代手動部分中的's')是excel文件,手動部分仍然可以工作嗎? – user1491298

+0

@ user1491298是的,因爲CVS模塊將每行作爲字符串列表返回。這在我的代碼's for r in s。split(','):'基本上模擬了這一點。 – Levon

+0

它一直告訴我列表索引超出了最後一行 bl [c] .append(r.split()[c]) 的範圍,並且我還將split(',')更改爲split('\ t ')爲我的文件 – user1491298

0
with open('data.txt') as f: 
    lis=[x.split() for x in f] 
cols=[x for x in zip(*lis)] 
for x in cols: 
    print(x) 

輸出:

('HST_9578_02_ACS_WFC_F775W', 'HST_10615_03_ACS_WFC_F435W', 'HST_10120_02_ACS_WFC_F658N', 'HST_10775_64_ACS_WFC_F606W', 'HST_10775_64_ACS_WFC_F814W', 'HST_9578_02_ACS_WFC_F775W', 'HST_10120_02_ACS_WFC_F625W', 'HST_10353_02_ACS_WFC_F435W', 'HST_10775_64_ACS_WFC_F606W') 
('245.8976441', '245.8976450', '245.8976758', '245.8977532', '245.8977532', '245.8978148', '245.8978053', '245.8976003', '245.8979115') 
('-26.5255957', '-26.5255138', '-26.5255024', '-26.5255296', '-26.5255296', '-26.5255491', '-26.5254741', '-26.5257784', '-26.5254936') 
('4339.570', '2084.978', '1778.055', '2586.612', '2586.612', '4328.571', '1769.711', '3758.430', '2576.410') 
('1882.364', '2101.122', '1752.193', '2603.519', '2603.519', '1885.712', '1754.229', '985.125', '2606.114') 
+0

我想OP想要列,不是線條。 – Emmanuel

+0

有沒有辦法讀取列而不是行,這樣我就可以將一個列表中的所有HST名稱,另一個列表中的下一列等等? – user1491298

+0

@Emmanuel解決方案固定,我誤解了這個問題。 –

0
>>> s = """HST_9578_02_ACS_WFC_F775W 245.8976441 -26.5255957 4339.570 1882.364 
HST_10615_03_ACS_WFC_F435W 245.8976450 -26.5255138 2084.978 2101.122 
HST_10120_02_ACS_WFC_F658N 245.8976758 -26.5255024 1778.055 1752.193 
HST_10775_64_ACS_WFC_F606W 245.8977532 -26.5255296 2586.612 2603.519 
HST_10775_64_ACS_WFC_F814W 245.8977532 -26.5255296 2586.612 2603.519 
HST_9578_02_ACS_WFC_F775W 245.8978148 -26.5255491 4328.571 1885.712 
HST_10120_02_ACS_WFC_F625W 245.8978053 -26.5254741 1769.711 1754.229 
HST_10353_02_ACS_WFC_F435W 245.8976003 -26.5257784 3758.430 985.125 
HST_10775_64_ACS_WFC_F606W 245.8979115 -26.5254936 2576.410 2606.114 
""" 
>>> from collections import defaultdict 
>>> cols = defaultdict(list) 
>>> for line in s.split('\n'): 
    for index, val in enumerate(line.split()): 
     cols[index].append(val) 


>>> cols 
defaultdict(<type 'list'>, {0: ['HST_9578_02_ACS_WFC_F775W', 'HST_10615_03_ACS_WFC_F435W', 'HST_10120_02_ACS_WFC_F658N', 'HST_10775_64_ACS_WFC_F606W', 'HST_10775_64_ACS_WFC_F814W', 'HST_9578_02_ACS_WFC_F775W', 'HST_10120_02_ACS_WFC_F625W', 'HST_10353_02_ACS_WFC_F435W', 'HST_10775_64_ACS_WFC_F606W'], 1: ['245.8976441', '245.8976450', '245.8976758', '245.8977532', '245.8977532', '245.8978148', '245.8978053', '245.8976003', '245.8979115'], 2: ['-26.5255957', '-26.5255138', '-26.5255024', '-26.5255296', '-26.5255296', '-26.5255491', '-26.5254741', '-26.5257784', '-26.5254936'], 3: ['4339.570', '2084.978', '1778.055', '2586.612', '2586.612', '4328.571', '1769.711', '3758.430', '2576.410'], 4: ['1882.364', '2101.122', '1752.193', '2603.519', '2603.519', '1885.712', '1754.229', '985.125', '2606.114']}) 
>>> cols[0] 
['HST_9578_02_ACS_WFC_F775W', 'HST_10615_03_ACS_WFC_F435W', 'HST_10120_02_ACS_WFC_F658N', 'HST_10775_64_ACS_WFC_F606W', 'HST_10775_64_ACS_WFC_F814W', 'HST_9578_02_ACS_WFC_F775W', 'HST_10120_02_ACS_WFC_F625W', 'HST_10353_02_ACS_WFC_F435W', 'HST_10775_64_ACS_WFC_F606W'] 
>>> 
0

一個內膽版本:

with open('go.txt') as input: 
    print zip(*(line.split() for line in input)) 

或用CSV

with open('go.txt') as input: 
    print zip(*csv.reader(input, delimiter = ' ')) 

zip(*)最終完成您需要的轉換,將每列轉換爲自己的列表。 zip進行相反的轉換,將列組合回列表中。

相關問題