Python:在CSV中使用变量作为查找引用并返回值

Python:在CSV中使用变量作为查找引用并返回值,python,csv,lookup,Python,Csv,Lookup,找不到此解决方案的答案,所以一旦我找到答案,我想我应该重新发布我的解决方案 我正在寻找一种方法,获取用户输入(sys.argv[1]),并使用此值在CSV文件中查找x列中的另一个值(例如5)。这将是更大脚本的一部分,我将使用查找的值作为测试 我的例子是: col0,col1,col2,col3,col4 a,foo,bar,blah,1 b,foo,bar,blah,2 c,foo,bar,blah,3 d,foo,bar,blah,4 e,foo,bar,blah,5 f,foo,bar,bl

找不到此解决方案的答案,所以一旦我找到答案,我想我应该重新发布我的解决方案

我正在寻找一种方法,获取用户输入(
sys.argv[1]
),并使用此值在CSV文件中查找x列中的另一个值(例如5)。这将是更大脚本的一部分,我将使用查找的值作为测试

我的例子是:

col0,col1,col2,col3,col4
a,foo,bar,blah,1
b,foo,bar,blah,2
c,foo,bar,blah,3
d,foo,bar,blah,4
e,foo,bar,blah,5
f,foo,bar,blah,6
g,foo,bar,blah,7
h,foo,bar,blah,8
i,foo,bar,blah,9
j,foo,bar,blah,10
k,foo,bar,blah,11
l,foo,bar,blah,12
m,foo,bar,blah,13
n,foo,bar,blah,14
o,foo,bar,blah,15
p,foo,bar,blah,16
q,foo,bar,blah,17
r,foo,bar,blah,18
s,foo,bar,blah,19
t,foo,bar,blah,20
u,foo,bar,blah,21
v,foo,bar,blah,22
w,foo,bar,blah,23
x,foo,bar,blah,24
y,foo,bar,blah,25
z,foo,bar,blah,26

我这样做的方式如下:

import sys
import csv
#define user input as variable
input = sys.argv[1]
# read csv file into "fooReader"
fooReader = csv.reader(open('test1.csv', 'rb'), delimiter = ',', quotechar="\"")
# read each row in "fooReader"
for row in fooReader:
        # define first row column as "value" for testing
        value = row[0]
        # test if value (1st column) is the same as input (user input)
        if value == input:
                # ...if it is then print the 5th column in a certain way
                print value + " = " + row[4]

然后可以使用它将
行[4]
指定为另一个所需测试中的变量。

我这样做的方式如下:

import sys
import csv
#define user input as variable
input = sys.argv[1]
# read csv file into "fooReader"
fooReader = csv.reader(open('test1.csv', 'rb'), delimiter = ',', quotechar="\"")
# read each row in "fooReader"
for row in fooReader:
        # define first row column as "value" for testing
        value = row[0]
        # test if value (1st column) is the same as input (user input)
        if value == input:
                # ...if it is then print the 5th column in a certain way
                print value + " = " + row[4]

然后,可以使用它将
行[4]
指定为所需的另一个测试中的变量。

我快速查看了您的Javascript问题,如果您只在字母表中映射char->position,那么下面呢

def char_to_pos(char):
    from string import ascii_lowercase
    try:
        return ascii_lowercase.index(char) + 1
    except ValueError as e:
        pass # no match - do what's sensible here
如果您想预生成一个查找表,则类似于:

from string import ascii_lowercase
from itertools import count

lookup = dict(zip(ascii_lowercase, count(1)))
# or depending on taste
lookup = {letter: idx for idx, letter in enumerate(ascii_lowercase, start=1)}
否则,由于CSV文件通常比较小,您可以将整个文件加载到RAM中,以避免以后重复顺序查找(只要CSV不太大,就会使您的机器处于昏迷状态)


我快速地看了一下你的Javascript问题,如果你只在字母表中映射char->position,那么下面呢

def char_to_pos(char):
    from string import ascii_lowercase
    try:
        return ascii_lowercase.index(char) + 1
    except ValueError as e:
        pass # no match - do what's sensible here
如果您想预生成一个查找表,则类似于:

from string import ascii_lowercase
from itertools import count

lookup = dict(zip(ascii_lowercase, count(1)))
# or depending on taste
lookup = {letter: idx for idx, letter in enumerate(ascii_lowercase, start=1)}
否则,由于CSV文件通常比较小,您可以将整个文件加载到RAM中,以避免以后重复顺序查找(只要CSV不太大,就会使您的机器处于昏迷状态)


@伊萨尔普斯诺洛蒙:在我看来,在你问他尝试了什么(10:47:38 vs 10:49:31)之前,OP实际上发布了他对这个问题的自我回答。这是正确的。。。这是我思考了一段时间的事情,结果很简单。因此,我想我会与大家分享,如果有人提出改进建议,我会欢迎他们,我相信其他人也会这么做。:-)_@伊萨尔普斯诺洛蒙:在我看来,在你问他尝试了什么(10:47:38 vs 10:49:31)之前,OP实际上发布了他对这个问题的自我回答。这是正确的。。。这是我思考了一段时间的事情,结果很简单。因此,我想我会与大家分享,如果有人提出改进建议,我会欢迎他们,我相信其他人也会这么做。:-)_这与JavaScript项目不同,这是不同的。我将在CSV中匹配一个字符串(用户输入作为设备模型),然后输出另一个字符串(类似于OS类型)。我确实喜欢这些信息,因为我还在学习(所以我会投票),但是你的第三段代码比我的更有效吗我以为我正在把它载入记忆。还有什么会构成一个大的CSV?@MHibbin您的代码创建一个CSV阅读器对象并逐行读取,直到找到匹配项为止(它似乎不会处理未找到匹配项的情况);这对于一次性查找很好。如果文件很大,并且重复查找,则将其存储在更合适的数据结构中更合适。这里的第三个示例加载到存储在RAM中的
dict
(在大多数计算机系统上,对于经常使用的表来说,几百Mb并非不合理),并使您能够使用
dict
的功能(快速查找时间)“MHibbin”您可能还想考虑,而不是使用CSV文件来存储数据,使用一个简单的数据库,例如SqLITE3,这是自2.5以来Python STDLIB的一部分。这将使您能够将其保存在磁盘上,但在查找列上维护索引,并在SQL中执行更复杂的查询(如果需要),而不是使用Python
select sum(col4)从您的_表中进行编码,其中col0不在col4的('a'、'e'、'i'、'o'、'u')组中。
等等。我不认为CSV会有这么大。我还必须使用CSV,因为它与另一个使用CSV文件的应用程序交互。这与JavaScript项目不同,这是不同的。我将在CSV中匹配一个字符串(用户输入作为设备模型),然后输出另一个字符串(类似于OS类型)。我确实喜欢这些信息,因为我还在学习(所以我会投票),但是你的第三段代码比我的更有效吗我以为我正在把它载入记忆。还有什么会构成一个大的CSV?@MHibbin您的代码创建一个CSV阅读器对象并逐行读取,直到找到匹配项为止(它似乎不会处理未找到匹配项的情况);这对于一次性查找很好。如果文件很大,并且重复查找,则将其存储在更合适的数据结构中更合适。这里的第三个示例加载到存储在RAM中的
dict
(在大多数计算机系统上,对于经常使用的表来说,几百Mb并非不合理),并使您能够使用
dict
的功能(快速查找时间)“MHibbin”您可能还想考虑,而不是使用CSV文件来存储数据,使用一个简单的数据库,例如SqLITE3,这是自2.5以来Python STDLIB的一部分。这将使您能够将其保存在磁盘上,但在查找列上维护索引,并在SQL中执行更复杂的查询(如果需要),而不是使用Python
select sum(col4)从您的_表中进行编码,其中col0不在col4的('a'、'e'、'i'、'o'、'u')组中。
等等。我不认为CSV会有这么大。我还必须使用CSV,因为它与另一个使用CSV文件的应用程序交互