理解多个python' open'文件功能

时间:2015-05-15 01:49:52

标签: python

我很难理解第二个问题是什么?打开'功能在这里。

所以,在第一个' 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)

4 个答案:

答案 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_filefp都不存在,则第一次运行脚本时,它将创建文件并保存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>

所以第二个fpwith块内的局部变量。

您的代码似乎想首先从网址读取数据,然后将其写入save_as_file,然后再次从save_as_file读取数据并对load_from_file执行某些操作,例如验证内容

答案 2 :(得分:1)

第二个with语句打开文件进行阅读是正确的。

这是怎么回事:

  1. 加载来自网址的响应
  2. 如果save_as_file为None:
    1. 在回复上调用load_from_file并返回结果
  3. 否则:
    1. 将回复内容存储到save_as_file
    2. 对文件内容调用load_from_file并返回结果
  4. 因此,如果设置了save_as_file,它会将响应主体存储在文件中,对其进行处理,然后返回处理后的结果。否则它只处理响应主体并返回结果。

    这里实现它的方式可能是因为load_from_file期望一个类似文件的对象,而程序员看到的最简单的方法就是读回文件。

    可以通过将响应主体保留在内存中并使用Python 3的io模块或Python 2 StringIO来提供类似文件的对象来实现。从内存中响应主体,从而避免再次读取文件的需要。

    fp在第二个with语句中重新分配,与其他任何变量分配给另一个值的方式相同。

答案 3 :(得分:0)

以下是一段描述它的代码:

  1. __ with__提供了一个&#34;清理&#34;什么时候存在
  2. 可以处理块内发生的异常
  3. 输入时也可以执行代码
  4. 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")