2017-06-21 57 views
0

例如,讓我們說這是「my.CSV」:在PYTHON中,如何使用多列索引按值訪問CSV單元格?

bus,seat,value 
-------------- 
001,0009,0.012 
001,0099,0.013 
001,0999,0.014 
002,0009,0.031 
002,0099,0.032 
002,0999,0.033 
... 

它是關於1GB,這樣比較大的,我的代碼庫是用Python

我需要定義下面的函數

def get_value(bus, seat): 
    # FILL CODE HERE 
    return value 

調用時,

v = get_value(1,9) 
print(v) 

的outpu t將是:

0.012 
+1

什麼是期望的輸出? – inspectorG4dget

+0

使用熊貓?這是python的標準 –

+0

你會如何用熊貓做到這一點? – Sqandr

回答

1

1GB很大,但通常仍然適合內存。所以如果你需要讀取許多值,將它讀入內存可能是一個很好的解決方案。

如果這確實是使用模式,我會文件讀入到散列與(總線,座)作爲鑰匙,和值作爲值

示例代碼(未測試):

import csv 
data = {} 
with open('my.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile) 
     for row in reader: 
      data[(row[0],row[1)] = row[2] 

def get_value(data,bus,seat) 
    return data[(bus,seat)] 
+0

你能寫一些代碼嗎? – Sqandr

0

如果一切仍然能夠裝入內存,你可以構建一個字典,從您的所有數據是這樣的:

from csv import reader 
from collections import defaultdict 

data = defaultdict(dict) 

with open('file.csv', 'rb') as in_file: 
    csv_data = reader(in_file) 
    for row in csv_data: 
     data[int(row[0])][int(row[1])] = float(row[2]) 

print(data[1][9]) # 0.012 
+0

謝謝,這是它。 int()和float()強制轉換是必要的。 如果該文件不適合內存,不管出於什麼原因? – Sqandr

+0

那麼你可能不得不開始考慮一個數據庫。一個鍵值存儲可能就足夠了。有幾個選項可用...這可能有所幫助:https://www.fullstackpython.com/no-sql-datastore.html(他們建議'redis'或'memcached')。也許有更簡單的選項... –

+0

順便說一句:python 3.6大量改進了字典的內存使用......如果你選擇了可能值得的解釋器! –

0

你可以使用networkx包使用網絡的方式。如果您的data.txt是:

001,0009,0.012 
001,0099,0.013 
001,0999,0.014 
002,0009,0.031 
002,0099,0.032 
002,0999,0.033 
... 

你可以做

import networkx as nx 
G = nx.read_weighted_edgelist('data.txt', delimiter=',') 

G現在是一個哈希的對象,這樣

G['001']['0009'] 

輸出字典

{'weight': 0.012} 

networkx用於我廣泛的數據庫知識,所以它可以爲你的工作正常。

相關問題