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

2024-09-30 01:34:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个绝对的编程高手。所以我有个问题要解决。 首先,我有一个CSV文件,如下所示:

在文本.csv公司名称:

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

现在,我想在Python程序中从CSV导入这个“数据”,以便直接从CSV文件生成变量:

jan1=A
jan2=B
...

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


Tags: 文件csv数据字符串文本名称编程公司
3条回答

问题是CSV的内容不是变量,而是字符串。CSV文件包含字符串“jan1,A”。现在,在Python中,可以通过变量的名称直接操作变量,因为所有的东西(几乎)都是字典。然而,要知道你正在冒险进入一条奇怪的、无法维护的、完全疯狂的道路。像这样弄乱“内部结构”的做法只能在最大程度上采取预防措施,并尽可能避免。在

关于您的问题:我提到Python一直是字典。具体来说,vars()locals()和{}可能就是您要找的:

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

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

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

^{pr2}$

您需要定义新变量jan1jan2jan3。。。对于这些变量,根据CSV中指定的规则。让我们暂时忽略CSV部分(Danny Cullen关于csv模块的回答非常恰当),假设您已经将CSV加载到元组列表中:

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

现在您要用变量A设置变量jan1。您可以通过修改模块的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

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

另外,我在上面提到过模块有不同的全局变量。当函数、类、模块、包都将定义它们的局部作用域,并且在不同的实例中引用全局变量和局部变量时,这个兔子洞会更深。这个例子在一个很小的项目上运行得很好,在CLI中,但是要扩展它是不可能的:跟踪谁添加了什么,在哪里以及如何在你开始用变量字典弄脏你的手时,几乎不可能实现。在

如果你真的要走“变量定义”的道路,我强烈建议你熟悉Python中的scoping rules,并为追踪“看起来不像代码的代码”这几个令人头疼的问题做好准备。。。在

听起来你想通过把数据转换成代码来“跨越”数据和代码之间的界限。这通常是不鼓励的,因为它可能是危险的(如果有人添加了一个命令到您的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]

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

^{pr2}$

使用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)

相关问题 更多 >

    热门问题