我有一个xlsx文件,有500,000行。我想将它复制到csv文件中,但我只能复制65k行然后程序结束。我的代码用于从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()
答案 0 :(得分:1)
在converting json to 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
此函数将从buffersize块中的给定文件对象读取块,并使解码器对象解析缓冲区中的整个JSON对象。每个解析的对象都会产生给调用者。
像这样使用:
with open('yourfilename', 'r') as infh:
for data in json_parse(infh):
# process object