# 將一個大文件,逐行讀出,寫入數據庫中。
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) # 打印