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