[英]file handling in python
提前致謝。 我編寫了一個適用於小文件的程序。 但這不適用於1 GB的文件。 請告訴我有沒有辦法處理大文件。 這是代碼。
fh=open('reg.fa','r')
c=fh.readlines()
fh.close()
s=''
for i in range(0,(len(c))):
s=s+c[i]
lines=s.split('\n')
for line in s:
s=s.replace('\n','')
s=s.replace('\n','')
print s
readlines
方法讀入整個文件。 對於與物理內存大小相關的文件,您不希望這樣做。
修復是以小塊讀取文件,並單獨處理它們。 例如,您可以執行以下操作:
for line in f.xreadlines():
... do something with the line
xreadlines
不返回行列表,而是返回迭代器,當for
循環調用它時,它會一次返回一行。 更簡單的方法是:
for line in f:
... do something with the line
根據您的操作,逐行處理文件可能很容易或很難。 我沒有真正得到你的示例代碼試圖做的事情,但看起來它應該是可行的。
該腳本無法正常工作,因為它預先讀取了文件的所有行,因此無需將整個文件保存在內存中。 迭代文件中所有行的最簡單方法是
for line in open("test.txt", "r"):
# do something with the "line"
使用readlines()可以立即讀取整個文件,因此您可以使用1 GB的內存。 試試這個嘗試:
f = open(...)
while 1:
line = f.readline()
if not line:
break
line = line.rstrip()
... do something with line
...
f.close()
如果您只需要刪除\\ n然后不要逐行執行,而是使用文本塊執行:
import sys
f = open('query.txt','r')
while 1:
part = f.read(1024)
if not part:
break
part = part.replace('\n', '')
sys.stdout.write(part)
你的程序非常冗余。 看起來您可以使用以下行完成所有操作:
import sys
for line in open('reg.fa'):
sys.stdout.write(line.rstrip())
足夠了。 該程序在問題中提供了與原始代碼相同的結果,但更簡單,更清晰。 它還可以處理任何大小的文件。
import sys
import os
如果沒有創建文件,請使用wb + mode,這將創建文件並寫入數據!
f = open('f_name.txt','wb+')
while 1:
part = f.read(1024)
if not part:
break
part = part.replace('\n', '')
sys.stdout.write(part)
f.close()
從您的編碼中可以清楚地看到您需要單行的字符串緩沖區。 作為編碼的觀點,將整個文件內容存儲在一個字符串緩沖區中是很糟糕的。 然后你處理了你的要求。 代碼包含太多局部變量。
您可以使用以下代碼塊。
f = open(file_name,mode)
對於f中的行:
"""
Do the processing
"""
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.