2016-06-10 77 views
3

我正在編寫一個通用程序來讀取和繪製來自.txt文件的大量數據。每個文件都有不同數量的列。我知道每個文件都有8個我不感興趣的列,所以我可以通過這種方式計算出相關列的數量。我如何讀取數據並將每個相關列的數據分類到單獨的變量中?如何將數據列分配給變量

這是我到目前爲止有:

datafile = 'plotspecies.txt' 
with open(datafile) as file: 
    reader = csv.reader(file, delimiter=' ', skipinitialspace=True) 
    first_row = next(reader) 
    num_cols = len(first_row) 
    rows = csv.reader(file, delimiter = ' ', quotechar = '"') 
    data = [data for data in rows] 

num_species = num_cols - 8 

我見過的人說,大熊貓有利於這樣的事情,但我似乎無法將其導入。我更喜歡沒有它的解決方案。

+0

你想完全排序? –

+0

來自每列的數據,以便我可以將每個物種作爲單個變量進行處理。 – evtoh

+0

你能提供一行的例子嗎?或者給我們提供關於該文件的任何細節?沒有這個答案很難回答。 –

回答

7

熊貓在這裏其實是正確的解決方案。問題是,爲了強有力地處理一些你不確定底層結構的東西,你需要注意很多邊緣情況,並試圖將它們放入csv模塊中,這是頭痛的一個方法(儘管它可以完成)

至於爲什麼你不能導入pandas原因是它不默認與python來。選擇語言時需要考慮的最重要的事情之一是它可以訪問的軟件包生態系統。 Python在這方面恰好是最好的之一,所以忽略不屬於標準python的一切就是忽略語言的最佳部分。

如果你在一個Windows環境,你應該開始設置conda。這將允許您以很少的開銷無縫探索python用戶可用的許多軟件包。這包括pandas,這實際上是解決這個問題的正確方法。查看安裝暢達這個鏈接獲取更多信息:http://conda.pydata.org/docs/install/quick.html

一旦你得到了pandas安裝它,因爲這很容易:

import pandas 
test = pandas.read_csv(<your_file>) 
your_Variable = test[<column_header>] 

易爲。

如果你真的,真的不希望使用的東西並不在核心蟒蛇那麼你就可以像下文中做到這一點,但是你有沒有給予足夠的細節一個實際的解決方案:

def col_var(input_file, delimiter): 
    # get each line into a variable 
    rows = open(input_file).read().splitlines() 

    # split each row into entries 
    split_rows = [row.split(delimiter) for row in rows] 

    # Re-orient your list 
    columns = zip(*split_rows) 

最低直觀的一塊,這是最後一行,所以這裏是你展示它是如何工作的一個小例子:

>>> test = [[1,2], [3,4]] 
>>> zip(*test) 
[(1, 3), (2, 4)] 
+0

我在OS X上。我安裝了Anaconda,但是我無法從中獲取熊貓。我很可能做錯了事。 – evtoh

+0

如果你在OS X上,那麼你不必費心使用'conda'。只需使用'pip'。我發現點子比「conda」要容易得多,沒有麻煩。 HTTPS://pip.pypa。io/en/stable /安裝/ –

+0

如果我使用pip,它會返回一個錯誤,說我沒有權限。 – evtoh

1

那麼,你可以使用CSV模塊提供有某種分隔符的內設置列appart的行。

import csv 

file_to_read_from = 'myFile.txt' 

#initializing as many lists as the columns you want (not all) 
col1, col2, col3 = [], [], [] 
with open(file_to_read_from, 'r') as file_in: 
    reader = csv.reader(file_in, delimiter=';') #might as well be ',', '\t' etc 
    for row in reader: 
     col1.append(row[0]) # assuming col 1 in the file is one of the 3 you want 
     col2.append(row[3]) # assuming col 4 in the file is one of the 3 you want 
     col3.append(row[5]) # assuming col 6 in the file is one of the 3 you want