openpyxl не может открыть более 65 тыс. строк

У меня есть файл xlsx, в котором содержится 500 000 строк. Я хочу скопировать его в файл CSV, но я могу скопировать только 65 000 строк, а затем программа заканчивается. Вот мой код, который я использую для копирования данных из файла XLSX в CSV file.amd требуется слишком много времени, чтобы распечатать 65k строк.

import openpyxl
import csv
import time
import collections

def csv_from_excel() :
    t1=(time.time())*1000
    workbook = openpyxl.load_workbook(filename = '5lac_xlsx.xlsx',optimized_read = True, use_iterators = True)
    sh=workbook.get_sheet_by_name('Sheet1')
    your_csv_file = open('your_csv_file.csv','wb')
    wr = csv.writer(your_csv_file,quoting=csv.QUOTE_ALL)
    t2=(time.time())*1000
    print (t2-t1)
    fp = open('your_csv_file.csv', 'wb')
    a = csv.writer(fp, delimiter=',')

    m1=(time.time())*1000
    count=0

    for row_t in sh.iter_rows():
        for cell in row_t :
            try :
                count=count+1
                wr.writerow([cell[3]])  
                #wr.writerow('\n')
            except :
                print "error"

    print "count"
    print count

    your_csv_file.close()

    m2=(time.time())*1000
    print (m2-m1)

csv_from_excel()

1 ответ

Аналогичная проблема обнаружилась при преобразовании json в csv, которая была решена путем чтения входного файла в виде кусков. В примере кода используется маленький размер чанка, в то время как большой файл работал с размером чанка 0x800000

Хотя пример кода предназначен для JSON, вы должны иметь возможность преобразовать его для обработки файла Excel, используя тот же принцип, за исключением использования процессоров Excel, таких как xlrd или одного из других пакетов Python Excel.

from json import JSONDecoder
from functools import partial


def json_parse(fileobj, decoder=JSONDecoder(), buffersize=2048):
  buffer = ''
  for chunk in iter(partial(fileobj.read, buffersize), ''):
     buffer += chunk
     while buffer:
         try:
             result, index = decoder.raw_decode(buffer)
             yield result
             buffer = buffer[index:]
         except ValueError:
             # Not enough data to decode, read more
             break

Эта функция будет считывать порции из данного файлового объекта в порциях размера буфера и иметь объект декодера, анализирующий целые объекты JSON из буфера. Каждый разобранный объект передается вызывающей стороне.

Используйте это так:

with open('yourfilename', 'r') as infh:
  for data in json_parse(infh):
    # process object
Другие вопросы по тегам