在附加模式下我的文件是否在RAM中打开?

时间:2017-09-04 08:16:43

标签: python python-2.7 python-3.x file

我写了一个代码,继续附加文件。这是代码:

writel = open('able.csv','a',encoding='utf-8',errors='ignore')
with open('test','r',encoding='utf-8',errors='ignore') as file:
    for i in file.readlines():
        data = functionforprocess(i)
        if data is not "":
            writel.write(data)
        if count% 10000 == 0:
            log = open('log','w')
            log.write(str(count))
            log.close()

我的问题是:我在append模式下打开的文件是否在RAM中可用?该文件是否像缓冲区一样,意味着如果我将data存储在变量中,然后将该变量写入file等于以追加模式打开文件并直接写入?

请说,让我摆脱这种混乱。

2 个答案:

答案 0 :(得分:2)

追加是文件I / O的基本功能,由操作系统执行。例如,使用模式aa+的fopen是POSIX标准的一部分。对于文件I / O,操作系统也会倾向于缓冲读写操作;例如,在大多数情况下,没有必要确保您传递给write的数据实际上始终在磁盘上。有时它位于操作系统某处的缓冲区中;有时,操作系统会将这些缓冲区转储到磁盘上。如果对您很重要,您可以使用fsync强制进行写入;这也是一个非常好的理由,确保在完成它们之后总是在打开的文件对象上调用close(或使用上下文管理器);如果你忘记了,你可能会因为操作系统中的那些缓冲区而出现奇怪的行为。

所以,回答你的问题。您打开的文件很可能在任何给定时刻都在RAM中。但是,据我所知,它不是可用的。您可以使用文件I / O方法与文件中的数据进行交互,但它不像是一个缓冲区,您可以获取内存地址,并回读您刚才写的内容。至于附加模式写入是否等同于将某些内容存储在缓冲区然后写入磁盘,我想我会说不。操作系统可能会以相同的方式缓冲任何类型的文件I / O写入,并且这是有效的原因是操作系统可以决定何时刷新缓冲区。如果将事物存储在变量中,然后以原子方式将其写入磁盘,则可以决定何时进行写入。

答案 1 :(得分:1)

open function的签名是:

open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

如果以“a”(追加)模式打开,则表示:打开以进行写入,如果存在则附加到文件末尾。缓冲没有任何意义。

可以使用缓冲参数自定义缓冲。引用文档:

  

buffering 是一个可选的整数,用于设置缓冲策略。传递0以切换缓冲关闭(仅允许在二进制模式下),1选择行缓冲(仅在文本模式下可用),以及整数> 1表示固定大小的块缓冲区的大小(以字节为单位)。如果没有给出缓冲参数,则默认缓冲策略的工作方式如下:

     
      
  • 二进制文件以固定大小的块缓冲;使用启发式方法选择缓冲区的大小,尝试确定底层设备的“块大小”并回退到io.DEFAULT_BUFFER_SIZE。在许多系统上,缓冲区的长度通常为4096或8192字节。
  •   
  • “交互式”文本文件(isatty()返回True的文件)使用行缓冲。其他文本文件使用上述策略用于二进制文件。
  •   

在您的示例中,打开文件以便以文本模式追加。

因此,在写入过程中,只有一大块数据存储在RAM中。如果你写一个“大”数据,它将被分成几个块。