2017-09-04 20 views
4

我寫了一個代碼,繼續追加文件。下面是它的代碼:在追加模式下我的文件是否在RAM中打開?

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存儲在變量中,然後將變量寫入文件等於在追加模式下打開文件並直接寫入?

請讓我擺脫這種困惑。

回答

2

追加是文件I/O的基本功能,由操作系統執行。例如,打開模式aa+是POSIX標準的一部分。對於文件I/O,操作系統也會傾向於緩衝讀寫操作;例如,對於大多數用途,沒有必要確保您傳遞給write的數據實際上始終在磁盤上。有時它位於操作系統某處的某個緩衝區中;有時操作系統會將這些緩衝區轉儲到磁盤中。如果對你很重要,你可以使用fsync強制寫入;這也是確保您在打開文件對象時始終調用close(或使用上下文管理器)的真正原因。如果你忘記了,你可能會因操作系統中的緩衝區而出現奇怪的行爲。

所以,要回答你的問題。您打開的文件在任何特定時刻都很可能在RAM中。不過,據我所知,這不是可用給你。你可以使用文件I/O方法與文件中的數據進行交互,但是它不像你可以獲得內存地址的緩衝區,並且可以回讀剛剛寫的內容。至於append-mode寫作相當於將某些內容存儲在緩衝區中然後寫入磁盤,我想我會說不。任何類型的文件I/O寫操作都可能被操作系統以相同的方式進行緩衝,而這種效率高的原因是操作系統可以決定何時刷新緩衝區。如果將某些東西存儲在一個變量中,然後將它們原子地寫入磁盤,則可以決定寫入的時間。

+1

不,在追加模式下文件不在RAM中。只有這個位置纔會被追求到最後。然後,在下一次寫入時,緩衝區被刷新並附加到最​​後。 –

1

open function的簽名是:

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

如果您在打開的「a」(追加)模式,這意味着:對寫開放,追加到,如果它存在的文件的末尾。沒有關於緩衝的內容。

緩衝可以用緩衝參數定製。引用文件:

緩衝是一個可選的整數,用於設置緩衝策略。通過0切換緩衝關閉(僅在二進制模式下允許),1選擇行緩衝(僅在文本模式下可用)以及> 1的整數,以指示固定大小的塊緩衝區的大小(以字節爲單位)。如果未給出緩衝參數,則默認緩衝策略的工作原理如下:

  • 二進制文件以固定大小塊緩衝;緩衝區的大小通過試圖確定底層設備的「塊大小」並回落到io.DEFAULT_BUFFER_SIZE的啓發式來選擇。在很多系統上,緩衝區的長度通常爲4096或8192字節。
  • 「交互式」文本文件(isatty()返回True的文件)使用行緩衝。其他文本文件使用上述的二進制文件策略。

在你的榜樣,您的文件被打開在文本模式下追加。

因此,在寫入過程中只有一大塊數據存儲在RAM中。如果你寫一個「大」的數據,它會被分成幾個塊。

+0

你需要更多的解釋嗎?我建議你upvote和[接受](https://meta.stackexchange.com/a/5235/344471)我的答案。 –

相關問題