Saya mencoba membaca file besar baris demi baris sambil juga menulis ke file besar dan saya ingin tahu cara "terbaik" untuk melakukannya.

Saya menemukan posting Stack Overflow ini untuk membaca besar file baris demi baris dan ingin mengetahui cara yang tepat untuk juga memasukkan penulisan ke file. Apakah ada yang lebih baik daripada membuat sarang ke-2 with open

Apa yang saya miliki saat ini:

 #args is parsed from the command line
 #file is an exogenous variable
 with open(args.inPath + file, "r") as fpIn:
   with open(args.outPath + file, "w") as fpOut:
     for line in fpIn:
       if re.match(some match): canWrite = True
       if re.match(some match 2): break
       if canWrite: fpOut.write(line)
0
noah 31 Mei 2019, 20:06

2 jawaban

Jawaban Terbaik

Anda tidak perlu menyusun pernyataan with. Pernyataan tunggal dengan dapat menggunakan beberapa manajer konteks.

with open(args.inPath + file, "r") as fpIn, open(args.outPath + file, "w") as fpOut:
    for line in fpIn:
       if re.match(some match): canWrite = True
       if re.match(some match 2): break
       if canWrite: fpOut.write(line)

Ini sedikit lebih bersih.

4
rdas 31 Mei 2019, 17:11

yield adalah teman terbaik Anda: melalui Metode Malas untuk Membaca Besar File dengan Python?

def read_in_chunks(file_object, chunk_size=1024):
  """Lazy function (generator) to read a file piece by piece.
  Default chunk size: 1k."""
  while True:
    data = file_object.read(chunk_size)
    if not data:
      break
    yield data

f = open(args.inPath + file, "r")

with open(args.outPath + file, "a") as fpOut:
  for chunk in read_in_chunks(f):
    if re.match(some match): canWrite = True
    if re.match(some match 2): break
    if canWrite: fpOut.write(chunk)

Lihat juga: https://www.pythoncentral.io/python-generators- and-yield-keyword/, https: //www.geeksforgeeks.org/use-yield-keyword-instead-return-keyword-python/

Ini akan jauh lebih ringan pada jejak memori Anda juga.

0
chaos 31 Mei 2019, 17:15