动态创建变量名并读取文件

2021-04-02 10:42:40 +08:00
 badacook
大家好,请教大家一个问题
场景是 想读取一个目录下的 csv 文件,将各个文件读取后赋值给以文件名(不含扩展名)的变量,赋值读取那一行写不出来,实例如下
os.chdir(datapath)
filelist = os.listdir(datapath)
for item in filelist:
if item.endswith('.csv'):
#先将 以 item 的文件名为变量名 = pd.read_csv(item)

比如:存在 a.csv
a = pd.read_csv(a.csv)
2030 次点击
所在节点    Python
13 条回复
typetraits
2021-04-02 10:49:57 +08:00
文件名存进 dict,然后访问 dict 里这些 key,这种思路怎么样
typetraits
2021-04-02 10:53:58 +08:00
局部变量可以通过 locals()访问,实际也是个 dict,我觉得你这个需求可以直接通过把 pandas DataFrame 放进 dict 解决
minami
2021-04-02 10:54:58 +08:00
用 exec 函数执行赋值语句
aijam
2021-04-02 10:59:19 +08:00
globals()[item[:-4]] = pd.read_csv(item)
badacook
2021-04-02 11:08:11 +08:00
@typetraits 为啥 还要转一步 ,能不能就在这个 for 内部 if 语句中完成啊,还要创建字典 再历遍字典啊
badacook
2021-04-02 11:55:15 +08:00
@minami exec 函数执行赋值语句,exec "item[:-4]=pd.read_csv(item,encoding='gbk')" ,其中 item 如何解析为变量啊
badacook
2021-04-02 12:09:18 +08:00
@minami
exstr = "'{0}'[:-4] = pd.read_csv({0},encoding='gbk')".format(item)
exec exstr
按照 你说的 生成每个条目 的命令字符串,使用 exec 函数,无法执行 是否 exec 不支持变量字符串
minami
2021-04-02 15:40:01 +08:00
@badacook #7 exec 是可以支持简单的变量赋值的,比如下面这样。太复杂的语句就不清楚了
>>> b=1
>>> exec('c=b')
>>> c
1
pursuer
2021-04-02 23:29:15 +08:00
@badacook 如果是赋值给模块作用域的变量,按照#4 的方式就可以了
badacook
2021-04-03 09:02:56 +08:00
@pursuer 那个赋值 加载 csv 在 for 的 if 分支下,而且 想做到变量名与加载的 csv 文件同名,其实作用域是想做到 for 的外层使用,只是想着看看 在 for 的 if 分支 赋值加载时 可以动态,不知道能否实现
pursuer
2021-04-03 09:53:11 +08:00
4#提供的那个 globals()[item[:-4]] = pd.read_csv(item)应该就可以了吧,如果你想做成一个独立的模块,然后修改调用者的作用域,那样的话需要将 global 传递过去,或者试着从调用栈找到调用者的模块,修改 sys.modules 。但后面这个我觉得不太好,可能意外的覆盖变量
badacook
2021-04-03 10:06:14 +08:00
@pursuer 你如果有空 能不能试一试,就是一个目录下有几个 csv 文件,还可能有其他类型文件,要做的就是使用 pandas 库,将这些 csv 文件 以文件名变量的形式读进去,变量作用域在整个脚本范围,其中 globals()不是返回的全局字典嘛,作为 python 新手的我 实在有些不理解,其中 exec 函数 提供字符串命令的执行,感觉跟这个需求也有点儿接近,能不能试一试 也是个简单的小实验 我也想通过这个小实验 理解这个过程,谢谢了
badacook
2021-04-04 08:12:27 +08:00
@aijam 非常感谢 globals() 与 vars() 均能实现 setting a string as a variable name,或者说 create variable variables in Python

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/767464

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX