1 同样的内容 exec出错
python 查找list中包含字符串的元素
https://blog.csdn.net/cuisidong1997/article/details/116493137
dizh_ = r"E:\Program Files\fs\speed_dev\data\designer\speedProject\进销存报表"
gosi_ = '2030'
goch_1 = '2031'
goch_2 = '2032'
def hebi_fuzh(gosi_= gosi_, goch_1= goch_1, goch_2= goch_2):
gosi_goch_1 = gosi_ + '-' + goch_1
gosi_goch_2 = gosi_ + '-' + goch_2
return gosi_goch_1, gosi_goch_2
def hebi_(ob_1= hebi_fuzh()[0], ob_2= hebi_fuzh()[1], dizh_= dizh_):
listdir_ = os.listdir(dizh_)
wj_1 = [ j for j in listdir_ if ob_1 in j ][0]
wj_2 = [ j for j in listdir_ if ob_2 in j ][0]
return wj_1, wj_2
hebi_() # 正确
'''
('ZFI077-2030-2031.xlsx', 'ZFI077-2030-2032.xlsx')
'''
import pandas as pd
import os
dizh_ = r"E:\Program Files\fs\speed_dev\data\designer\speedProject\进销存报表"
gosi_ = '2030'
goch_1 = '2031'
goch_2 = '2032'
def hebi_fuzh(gosi_= gosi_, goch_1= goch_1, goch_2= goch_2):
gosi_goch_1 = gosi_ + '-' + goch_1
gosi_goch_2 = gosi_ + '-' + goch_2
return gosi_goch_1, gosi_goch_2
def hebi_(ob_1= hebi_fuzh()[0], ob_2= hebi_fuzh()[1], dizh_= dizh_):
listdir_ = os.listdir(dizh_)
for i in range(1,3):
exec("wj_{} = [ j for j in listdir_ if ob_{} in j ][0]".format(i,i))
return wj_1, wj_2
hebi_()
'''
NameError Traceback (most recent call last)
<ipython-input-16-a94a41aeeea8> in <module>
14 return wj_1, wj_2
15
---> 16 hebi_()
<ipython-input-16-a94a41aeeea8> in hebi_(ob_1, ob_2, dizh_)
11 listdir_ = os.listdir(dizh_)
12 for i in range(1,3):
---> 13 exec("wj_{} = [ j for j in listdir_ if ob_{} in j ][0]".format(i,i))
14 return wj_1, wj_2
15
<string> in <module>
<string> in <listcomp>(.0)
NameError: name 'ob_1' is not defined
'''
解答 for ... exec("..=..") 在定义函数中使用 需要添加
经验: 遇到错误 需要关注错误类型
可尝试搜索 函数+错误类型
def fun_():
for i in range(5):
exec("var = {}".format(i))
print(var)
fun_()
'''
NameError Traceback (most recent call last)
Cell In[1], line 5
3 exec("var = {}".format(i))
4 print(var)
----> 5 fun_()
Cell In[1], line 4, in fun_()
2 for i in range(5):
3 exec("var = {}".format(i))
----> 4 print(var)
NameError: name 'var' is not defined
'''
def fun_():
for i in range(5):
exec("var = {}".format(i),globals())
print(var)
fun_()
2 Python 中 (&,|)和(and,or)之间的区别
列表非空判断中 用 | 或运算符会报错 应当用or
其他情况多逻辑判断 用or会报错 应当用 |
https://blog.csdn.net/weixin_40041218/article/details/80868521
3 函数内部的全局变量以及exec的注意事项
问题 如果将:
exec("'wj_{} = {}\\{}.xlsx'".format(i,dizh_,j), globals())
分开写成
exec("wj_{} = dizh +' \\' +'{}' +'.xlsx'".format(i,j), globals())
就会出错
(注意 上面仍然有错误 见4)
不完全正确解答:
def duqu_():
'''全局变量'''
global dizh_, list_wj, sht_, bool_duqu, wj_
'''定义参数'''
dizh_= r"D:\speedProject\进销存报表"
list_wj = ['核对模板','ZFI077-2030','ZFI077-3030-3031']
sht_ = '内部核对'
bool_duqu = True
for i,j in enumerate(list_wj):
wj_ = dizh_ + '\\' + j + '.xlsx'
exec("'wj_{} = {}\\{}.xlsx'".format(i,dizh_,j), globals())
'''检查文件'''
if os.path.exists(wj_) is not True:
print(wj_, "文件缺失")
bool_duqu = False
break # 跳出循环
'''读取文件'''
if j== '核对模板':
exec("df_{} = pd.read_excel(wj_, sht_)".format(i), globals())
else:
exec("df_{} = pd.read_excel(wj_)".format(i), globals())
4
问题 wj_{}仍然无法作为全局变量读出
问题解决:因为wj_=被误写在"''"的最里面了 应该是exec("wj_{}= '' ")
正确答案
exec("wj_{} = '{}\\{}.xlsx'".format(i,dizh_,j), globals())
def duqu_():
'''全局变量'''
global dizh_, list_wj, sht_, bool_duqu
'''定义参数'''
dizh_= r"D:\speedProject\进销存报表"
list_wj = ['核对模板','ZFI077-2030','ZFI077-3030-3031']
sht_ = '内部核对'
bool_duqu = True
for i,j in enumerate(list_wj):
exec("wj_{} = '{}\\{}.xlsx'".format(i,dizh_,j), globals())
'''检查文件'''
if os.path.exists(wj_) is not True:
print(wj_, "文件缺失")
bool_duqu = False
break # 跳出循环
'''读取文件'''
if j== '核对模板':
exec("df_{} = pd.read_excel(wj_{}, sht_)".format(i,i), globals())
else:
exec("df_{} = pd.read_excel(wj_{})".format(i,i), globals())
1,2,4的总结
dizh_变量在exec表达式里无法识别 需要format里读取
exec动态变量创建字符串 需要在字符串前面 例如 exec("变量{} = '表达式'")
exec创建全局变量, 添加参数globals()
函数创建全局变量,声明global
exec表达式的引号要谨慎
5 在局部变量中执行代码
6 字符串与公式
a,b = 1,1
str_ = "a+b"
eval("str_".format()) #
eval(str_.format()) # 返回值
7 公式转实际值
# import pandas as pd
df = pd.DataFrame([[1,2],[3,4]],columns= ['a','b'])
str_ = "df.a + df.b"
eval(str_)
df = pd.DataFrame([[1,2],[3,4]],columns= ['a','b'])
seri_str = pd.Series(["df.a + 1", "df.b - df.a"])
for i in seri_str.index:
val_ = eval(seri_str.loc[i])
print(val_)
7 openai chatgpt 的解答