我正在运行作业中的代码,作业中有open
。问题是,学生们被告知不要提交他们得到的数据,并假设我们有数据,而且open
没有查看sys.path
。你知道吗
幸运的是,我正在使用Spyder
,它允许我在初始化控制台时选择要执行的脚本。我想我可以重写open
,所以我定义了一个新的open
函数,它在文件的绝对路径上调用原始的open
。但是当有人使用with open(...) as ...
时,它就不起作用了。你知道吗
我知道这可能不是一件好事,但我不能检查每个提交的作业中的每个文件,寻找并替换对open
的调用。。。你知道吗
我的代码是:
old_open = open
def open(*args, **kwrdargs):
try:
res = old_open(*args,**kwrdargs)
return res
except:
args= list(args)
if ('DS1' in args[0]):
args[0]=DS1
elif ('DS2_X' in args[0]):
args[0] = DS2_X
elif ('DS2_Y' in args[0]):
args[0] = DS2_Y
args = tuple(args)
res = old_open(*args,**kwrdargs)
return res
DS1
、DS2_X
、DS2_Y
包含文件的绝对路径。你知道吗
执行时:
with open('DS1.data', 'r') as f:
我得到一个错误:
FileNotFoundError: [Errno 2] No such file or directory: 'DS1.data'
使用时:
f=open('DS1.data','r')
工作。你知道吗
我调试了代码,当使用with
时,不会调用我的open
,但当使用f=open(...)
时,会调用。为什么会这样?你知道吗
open
应该返回一个类似文件的对象,这个对象(即下例中的f
)应该有一个__enter__
和__exit__
。例如,您可以将with
-语句编写为:如果不返回由
open
返回的对象,而是返回文件对象周围的某个自己的包装器,那么您也必须包装这些对象。但从你的描述来看,它更像是你不需要它,而是你在某处没有返回一个文件。你的open
应该看起来像:相关问题 更多 >
编程相关推荐