动态创建变量名并读取文件 - V2EX
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 2511 次点击
    这是一个创建于 1722 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家好,请教大家一个问题
    场景是 想读取一个目录下的 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     Solana     5193 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 06:44 PVG 14:44 LAX 22:44 JFK 01:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86