2024-09-30 01:34:08 发布
网友
我是一个绝对的编程高手。所以我有个问题要解决。 首先,我有一个CSV文件,如下所示:
在文本.csv公司名称:
jan1,A jan2,B jan3,C jan4,A jan5,B jan6,C
现在,我想在Python程序中从CSV导入这个“数据”,以便直接从CSV文件生成变量:
jan1=A jan2=B ...
请注意,A不应作为字符串导入,它是一个变量。当我用CSV阅读器导入CSV时,所有的数据都以字符串的形式导入?在
A
问题是CSV的内容不是变量,而是字符串。CSV文件包含字符串“jan1,A”。现在,在Python中,可以通过变量的名称直接操作变量,因为所有的东西(几乎)都是字典。然而,要知道你正在冒险进入一条奇怪的、无法维护的、完全疯狂的道路。像这样弄乱“内部结构”的做法只能在最大程度上采取预防措施,并尽可能避免。在
关于您的问题:我提到Python一直是字典。具体来说,vars()、locals()和{}可能就是您要找的:
vars()
locals()
>>> env = globals() >>> a = 2 >>> env['a'] 2 >>> env['b'] = 3 >>> b 3
这是什么诡计?Python在字典中维护其scope的状态,您可以直接访问这些字典,并像其他字典一样操作它们。更具体地说,^{}和{a3}可以直接访问它。模块系统使其更加复杂(因为每个模块都维护自己的globals),但是让我们假设您在单个模块中操作。在
globals
假设您已经启动了解释器,并定义了以下变量:
您需要定义新变量jan1,jan2,jan3。。。对于这些变量,根据CSV中指定的规则。让我们暂时忽略CSV部分(Danny Cullen关于csv模块的回答非常恰当),假设您已经将CSV加载到元组列表中:
jan1
jan2
jan3
csv
>>> csv [('jan1', 'A'), ('jan2', 'B'), ('jan3', 'C'), ('jan4', 'A'), ('jan5', 'B'), ('jan6', 'C')]
现在您要用变量A的值设置变量jan1。您可以通过修改模块的globals()dict并获得变量的locals()值来完成此操作:
globals()
>>> 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"。所以这个过程是有损的。另一方面,带着你的映射的各种字典总是可以“转换回来”,甚至不需要经历这些“变量查找”环(只要保持键同步)。在
"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]
现在您可以通过字典查找来访问键/值:
使用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)
问题是CSV的内容不是变量,而是字符串。CSV文件包含字符串“jan1,A”。现在,在Python中,可以通过变量的名称直接操作变量,因为所有的东西(几乎)都是字典。然而,要知道你正在冒险进入一条奇怪的、无法维护的、完全疯狂的道路。像这样弄乱“内部结构”的做法只能在最大程度上采取预防措施,并尽可能避免。在
关于您的问题:我提到Python一直是字典。具体来说,}可能就是您要找的:
vars()
、locals()
和{这是什么诡计?Python在字典中维护其scope的状态,您可以直接访问这些字典,并像其他字典一样操作它们。更具体地说,^{} 和{a3}可以直接访问它。模块系统使其更加复杂(因为每个模块都维护自己的
globals
),但是让我们假设您在单个模块中操作。在假设您已经启动了解释器,并定义了以下变量:
^{pr2}$您需要定义新变量
jan1
,jan2
,jan3
。。。对于这些变量,根据CSV中指定的规则。让我们暂时忽略CSV部分(Danny Cullen关于csv
模块的回答非常恰当),假设您已经将CSV加载到元组列表中:现在您要用变量
A
的值设置变量jan1
。您可以通过修改模块的globals()
dict并获得变量的locals()
值来完成此操作:整个阅读过程的自动化很简单:
这将解决您的问题,但让我强调一下其他人说过的话:这是危险的,完全不可维护的,通常应避免!其中一个原因是从“string”到“variable”非常简单(我们刚刚做到了)。另一方面,从变量返回字符串是不可能的!
jan1
包含一个值,而没有其他值,它无法知道您将其称为"jan1"
。所以这个过程是有损的。另一方面,带着你的映射的各种字典总是可以“转换回来”,甚至不需要经历这些“变量查找”环(只要保持键同步)。在另外,我在上面提到过模块有不同的全局变量。当函数、类、模块、包都将定义它们的局部作用域,并且在不同的实例中引用全局变量和局部变量时,这个兔子洞会更深。这个例子在一个很小的项目上运行得很好,在CLI中,但是要扩展它是不可能的:跟踪谁添加了什么,在哪里以及如何在你开始用变量字典弄脏你的手时,几乎不可能实现。在
如果你真的要走“变量定义”的道路,我强烈建议你熟悉Python中的scoping rules,并为追踪“看起来不像代码的代码”这几个令人头疼的问题做好准备。。。在
听起来你想通过把数据转换成代码来“跨越”数据和代码之间的界限。这通常是不鼓励的,因为它可能是危险的(如果有人添加了一个命令到您的csv文件,抹去您的计算机呢?)。在
相反,只需用逗号分隔文件中的行,并将第一部分变量名保存为字典键,并将第二部分作为值:
现在您可以通过字典查找来访问键/值:
^{pr2}$使用python CSV模块
https://docs.python.org/2/library/csv.html
相关问题 更多 >
编程相关推荐