如何在Python中从CSV文件创建变量

时间:2016-04-15 09:19:01

标签: python csv variables

我是编码中的绝对noobie。所以我有一个问题需要解决。 首先,我有一个像这样的CSV文件,例如:

text.csv:

  

jan1,A
   jan2,B
   jan3,C
   jan4,A
   jan5,B
   jan6,C

现在我要导入这个"数据"来自Python程序中的CSV,以便直接从CSV文件中生成变量:

jan1=A
jan2=B
...

请注意A不应该作为字符串导入,它是一个变量。当我使用CSV阅读器导入CSV时,所有数据都作为字符串导入?

5 个答案:

答案 0 :(得分:1)

听起来你想要跨越边界"通过将数据转换为代码来实现数据和代码之间的关系。这通常是不鼓励的,因为它可能很危险(如果有人在您的csv文件中添加了擦除计算机的命令,该怎么办?)。

相反,只需用逗号分隔文件中的行,并将第一部分(变量名称)保存为字典键,并使第二部分成为值:

csv_dict = {}

with open(csv_file, "r") as f:
    for line in f:
        key_val = line.strip().split(",")
        csv_dict[key_val[0]] = key_val[1]

您现在可以通过字典查找访问键/值:

>>> csv_dict["jan5"]
'B'
>>> csv_dict["jan4"]
'A'
>>> my_variable = data_dict["jan4"]
>>> my_variable
'A'

答案 1 :(得分:1)

问题是CSV的内容不是变量,而是字符串。您的CSV文件包含字面上字符串" jan1,A"。现在, 可以在Python中直接通过名称操作变量,因为一切都是(几乎)字典一直向下。但是,请注意,你正冒险进入一个奇怪的,不可维护的,彻头彻尾的疯狂道路。与内部的混乱'像这样只应该在最大限度的预防下使用,并尽可能避免使用。

关于你的问题:我提到Python一直都是字典。具体而言,vars()locals()globals()可能是您正在寻找的内容:

>>> env = globals()
>>> a = 2
>>> env['a']
2
>>> env['b'] = 3
>>> b
3

那是什么诡计? Python在字典中维护其scope的状态,并且可以直接访问这些字典,并像任何其他字典一样操纵它们。更具体地说,locals()globals()可让您直接访问它。模块系统使其更复杂(因为每个模块都维护自己的globals),但我们假设您在单个模块中运行。

因此,假设您已经启动了解释器,并定义了以下变量:

>>> A = 1
>>> B = 2
>>> C = 3

您希望根据CSV中指定的规则为这些变量定义新变量jan1jan2jan3,....我们暂时忽略CSV部分(Danny Cullen关于csv模块的答案非常适合),让我们假设您已将CSV加载到元组列表中:

>>> csv
[('jan1', 'A'),
 ('jan2', 'B'),
 ('jan3', 'C'),
 ('jan4', 'A'),
 ('jan5', 'B'),
 ('jan6', 'C')]

现在,您希望使用变量jan1 设置变量A。您可以通过修改模块的globals() dict并获取变量的locals()值来实现此目的:

>>> glob = globals()
>>> loc = locals()
>>> glob['jan1'] = loc['A']
>>> jan1
1

自动化整个阅读是微不足道的:

>>> for var_to_set, value_to_get in csv:
...     glob[var_to_set] = loc[value_to_get]
>>>
>>> jan5
2

这将解决您的问题,但让我强调其他人所说的话:这是危险的,完全无法维护,通常应该避免!其中一个原因就是从字符串'字符串开始非常简单。变量'变量' (我们刚刚做过)。另一方面,不可能从变量返回到字符串! jan1包含一个值,而没有别的,它无法知道您将其称为"jan1"。所以这个过程是有损的。另一方面,随着您的映射携带各种字典总是可以被转换回来,甚至不经过这些变量查找'箍(只是保持键同步)。

另外,我在上面提到模块有不同的全局变量。随着函数,类,模块,包都将定义其局部范围,并且在不同实例中不同地引用全局变量和局部变量,那个兔子洞会更深入。这个例子适用于一个微小的项目,在CLI中,但它不可能来扩展这个:跟踪谁添加什么,在哪里以及如何在你开始弄脏时几乎不可能呈现变量词典。

如果确实必须使用变量定义'方式,我强烈建议你熟悉Python中的scoping rules,并为很多令人头疼的问题做好准备,追踪那些看起来不像代码的代码......

答案 2 :(得分:0)

使用python CSV模块

https://docs.python.org/2/library/csv.html

import csv
  with open('test.csv', 'rb') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
      print ', '.join(row)

答案 3 :(得分:0)

你应该做的事情应该是可能的,但一般来说它并不被认为是好事......而是使用字典。

foovar = {'A': 1, 'B': 2, 'C': 3, ...} # Dictionary to store your 'variables'
jan1 = foovar['A']
jan2 = foovar['B']
...

如果你的第一列数据(jan1,jan2,...)必须用作变量名,那么也要使用字典。

答案 4 :(得分:0)

如果您真的希望将CSV变为变量,可以执行以下操作:

row = "jan1,A"
exec("%s = %s" % (row.split(",")[0], row.split(",")[1]))

你必须先定义A

但请注意,正如其他提到的那样,它真的非常气馁。映射数据和代码的正确方法是使用词典。