我很难理解第二个问题是什么?打开'功能在这里。
所以,在第一个' open'部分,我们基本上说out = open(save_as_file, 'wb+')
,对吧? (仍然是使用'开放')的新手。我们后来写信给它,然后打开'自动关闭' out' file.That我得到的 - 我们在请求中将此响应对象作为二进制文件写入指定的save_as_file位置,直到我们达到第81920个字符,即我们的缓冲区#。
第二次'进行了什么?以与上述相同的方式打破它,它几乎是fp = open(save_as_file, 'r')
,对吧?是什么让fp更早被分配了请求响应对象?我们只是打开save_as_file来使用它来阅读,但不能从中读取或提取任何内容,所以我不明白它的原因。如果有人能够用英语解释发生了什么,以及第二个问题的话,那就是开放式的'部分,非常感谢。
(不要担心最后的load_from_file函数,这只是该类下的另一个函数)
def load_from_url(self, url, save_as_file=None):
fp = requests.get(url, stream=True,
headers={'Accept-Encoding': None}).raw
if save_as_file is None:
return self.load_from_file(fp)
else:
with open(save_as_file, 'wb+') as out:
while True:
buffer = fp.read(81920)
if not buffer:
break
out.write(buffer)
with open(save_as_file) as fp:
return self.load_from_file(fp)
答案 0 :(得分:2)
我是您所指的author的原始code;我同意这有点不清楚。
如果我们点击else
语句中的特定代码,这意味着我们希望将我们最初从calling the URL获取的数据保存到文件中。这里,fp
实际上是来自URL调用的响应文本。
如果从命令行运行,我们传入else
并且该文件实际上还不存在,我们将点击--cpi-file=foobar.txt
语句;它充当了here提到的目标文件。如果您没有传入--cpi-file=foobar.txt
,那么程序将不写入文件,它将直接通过{读取响应数据(来自fp
) {1}}。
那么,如果该文件不存在但我们确实在命令行中传递了它,我们将从URL(load_from_file
)中获取数据,并将该数据写入目标文件({{1} })。它现在存在供我们参考(它将在你的文件系统上),如果我们想在这个脚本中再次使用它。
然后,我们将再次打开该确切文件并调用fp
来实际读取和解析我们最初从响应中获取的数据(save_as_file
)。
现在 - 如果我们运行此脚本两次,load_from_file
和fp
都不存在,则第一次运行脚本时,它将创建文件并保存CPI数据。该脚本第二次运行时,实际上会避免再次调用CPI URL重新下载数据,只需转到straight to parsing the CPI data from the file。
--cpi-file=foobar.txt
有点误导性的名称,应该是foobar.txt
,因为它可以从our api call或文件中读取响应数据。
希望这是有道理的。在newcoder.io的下一个版本中,我一定会清楚这个语言&编码了一下。
答案 1 :(得分:1)
我尝试使用以下代码来模拟您的案例:
fp = open("/Users/example1.py",'wb+')
print "first fp",fp
with open("/Users/example2.py") as fp:
print "second fp",fp
输出结果为:
first fp <open file '/Users/example1.py', mode 'wb+' at 0x10b200390>
second fp <open file '/Users/example2.py', mode 'r' at 0x10b200420>
所以第二个fp
是with
块内的局部变量。
您的代码似乎想首先从网址读取数据,然后将其写入save_as_file
,然后再次从save_as_file
读取数据并对load_from_file
执行某些操作,例如验证内容
答案 2 :(得分:1)
第二个with
语句打开文件进行阅读是正确的。
这是怎么回事:
load_from_file
并返回结果save_as_file
load_from_file
并返回结果因此,如果设置了save_as_file
,它会将响应主体存储在文件中,对其进行处理,然后返回处理后的结果。否则它只处理响应主体并返回结果。
这里实现它的方式可能是因为load_from_file
期望一个类似文件的对象,而程序员看到的最简单的方法就是读回文件。
可以通过将响应主体保留在内存中并使用Python 3的io模块或Python 2 StringIO来提供类似文件的对象来实现。从内存中响应主体,从而避免再次读取文件的需要。
fp
在第二个with
语句中重新分配,与其他任何变量分配给另一个值的方式相同。
答案 3 :(得分:0)
以下是一段描述它的代码:
class MyClass(object):
def __enter__(self):
print("entering the myclass %s")
return self
def __exit__(self, type, value, traceback):
print("Exitinstance %s" %(id(self)))
print("error type {0}".format(type))
print("error value {0}".format(value))
print("error traceback {0}".format(traceback))
print("exiting the myclass")
def sayhi(self):
print("Sayhi instance %s" %(id(self)))
with MyClass() as cc:
cc.sayhi()
print("after the block ends")