Python 高級編程和異步IO併發編程 --09_6 生成器如何讀取大文件

# 將一個大文件,逐行讀出,寫入數據庫中。
f = open()
for line in f:  # 這樣遍歷可以,如果大文件是同一行?這種方式就會失效。
    
f.readlines()   # 這種方式也不可
# 將一個大文件,逐行讀出,寫入數據庫中。
f = open()
f.read(4096)   # 限定每次只能讀出4096個字符。
f.read(4096)   # 會接着上一次讀字符的偏移量,繼續讀出4096個字符。反覆調用,就可以逐次讀完全部數據。
# 將一個大文件,逐行讀出,寫入數據庫中。
def myreadlines(f,newline):
    buff = ""                                   # 聲明一個緩存,用於處理已經讀出的數據
    while True:
        while newline in buff:                  # 首先查詢緩存中的數據是否包含分隔符“|”
            pos = buff.index(newline)           # 如果存在分隔符,會將該字符的位置找到。 
            yield buff[:pos]                    # 會從第0位置開始,一直到找到分隔符“|”的位置進行切片
            buff = buff[pos + len(newline):]    # 由於每次讀出4096,有可能把兩行數據讀到一個buffer中,
                                                # 因此需要對buffer進行更新,繼續while循環,判斷字符串“|”是否存在buffer中,
                                                # 如果存在,則繼續執行“pos = buff.index(newline) ”,繼續執行“yield buff[:pos] ”
        chunk = f.read(4096)          # 剛開始時,pos 位置一定爲0,且“while newline in buff”這個條件也不成立,會
                                      # 首先讀取4096 這麼長的字符,
        if not chunk:                 # 如果沒有讀到,說明已經讀到了文件結尾。  
            yield buff                # 處理邊界條件。
            break
        buff += chunk                 # 如果讀到,就會將chunk加到buffer中,繼續while循環
            
with open("input.txt") as f:
    for line in myreadlines(f,"{|}"):  # 以 “|” 作爲分隔符 # 對yield出來的數據,在buffer中進行切片
        print(line)                    # 打印

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章