2017-06-21 50 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用于我广泛的数据库知识,所以它可以为你的工作正常。

相关问题