V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
badacook
V2EX  ›  Python

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

  •  
  •   badacook · 2021-04-02 10:42:40 +08:00 · 1814 次点击
    这是一个创建于 1091 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家好,请教大家一个问题
    场景是 想读取一个目录下的 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)
    13 条回复    2021-04-04 08:12:27 +08:00
    typetraits
        1
    typetraits  
       2021-04-02 10:49:57 +08:00
    文件名存进 dict,然后访问 dict 里这些 key,这种思路怎么样
    typetraits
        2
    typetraits  
       2021-04-02 10:53:58 +08:00
    局部变量可以通过 locals()访问,实际也是个 dict,我觉得你这个需求可以直接通过把 pandas DataFrame 放进 dict 解决
    minami
        3
    minami  
       2021-04-02 10:54:58 +08:00
    用 exec 函数执行赋值语句
    aijam
        4
    aijam  
       2021-04-02 10:59:19 +08:00
    globals()[item[:-4]] = pd.read_csv(item)
    badacook
        5
    badacook  
    OP
       2021-04-02 11:08:11 +08:00
    @typetraits 为啥 还要转一步 ,能不能就在这个 for 内部 if 语句中完成啊,还要创建字典 再历遍字典啊
    badacook
        6
    badacook  
    OP
       2021-04-02 11:55:15 +08:00
    @minami exec 函数执行赋值语句,exec "item[:-4]=pd.read_csv(item,encoding='gbk')" ,其中 item 如何解析为变量啊
    badacook
        7
    badacook  
    OP
       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
        8
    minami  
       2021-04-02 15:40:01 +08:00
    @badacook #7 exec 是可以支持简单的变量赋值的,比如下面这样。太复杂的语句就不清楚了
    >>> b=1
    >>> exec('c=b')
    >>> c
    1
    pursuer
        9
    pursuer  
       2021-04-02 23:29:15 +08:00
    @badacook 如果是赋值给模块作用域的变量,按照#4 的方式就可以了
    badacook
        10
    badacook  
    OP
       2021-04-03 09:02:56 +08:00
    @pursuer 那个赋值 加载 csv 在 for 的 if 分支下,而且 想做到变量名与加载的 csv 文件同名,其实作用域是想做到 for 的外层使用,只是想着看看 在 for 的 if 分支 赋值加载时 可以动态,不知道能否实现
    pursuer
        11
    pursuer  
       2021-04-03 09:53:11 +08:00 via Android
    4#提供的那个 globals()[item[:-4]] = pd.read_csv(item)应该就可以了吧,如果你想做成一个独立的模块,然后修改调用者的作用域,那样的话需要将 global 传递过去,或者试着从调用栈找到调用者的模块,修改 sys.modules 。但后面这个我觉得不太好,可能意外的覆盖变量
    badacook
        12
    badacook  
    OP
       2021-04-03 10:06:14 +08:00
    @pursuer 你如果有空 能不能试一试,就是一个目录下有几个 csv 文件,还可能有其他类型文件,要做的就是使用 pandas 库,将这些 csv 文件 以文件名变量的形式读进去,变量作用域在整个脚本范围,其中 globals()不是返回的全局字典嘛,作为 python 新手的我 实在有些不理解,其中 exec 函数 提供字符串命令的执行,感觉跟这个需求也有点儿接近,能不能试一试 也是个简单的小实验 我也想通过这个小实验 理解这个过程,谢谢了
    badacook
        13
    badacook  
    OP
       2021-04-04 08:12:27 +08:00
    @aijam 非常感谢 globals() 与 vars() 均能实现 setting a string as a variable name,或者说 create variable variables in Python
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5452 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 01:34 · PVG 09:34 · LAX 18:34 · JFK 21:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.