Python 将txt转换为xlsx时的MemoryError
相关问题: 1. 我的代码是Python 将txt转换为xlsx时的MemoryError,python,python-2.7,openpyxl,Python,Python 2.7,Openpyxl,相关问题: 1. 我的代码是 import csv import openpyxl import sys def convert(input_path, output_path): """ Read a csv file (with no quoting), and save its contents in an excel file. """ wb = openpyxl.Workbook(
import csv
import openpyxl
import sys
def convert(input_path, output_path):
"""
Read a csv file (with no quoting), and save its contents in an excel file.
"""
wb = openpyxl.Workbook()
ws = wb.worksheets[0]
with open(input_path) as f:
reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
for row_index, row in enumerate(reader, 1):
for col_index, value in enumerate(row, 1):
ws.cell(row=row_index, column=col_index).value = value
print 'hello world'
wb.save(output_path)
print 'hello world2'
def main():
try:
input_path, output_path = sys.argv[1:]
except ValueError:
print 'Usage: python %s input_path output_path' % (sys.argv[0],)
else:
convert(input_path, output_path)
if __name__ == '__main__':
main()
除了一些输入文件外,此代码可以正常工作。我找不到导致此问题的输入txt和不导致此问题的输入txt之间的区别
我的第一个猜测是编码。我尝试将输入文件的编码更改为UTF-8和带有BOM的UTF-8。但这失败了
我的第二个猜测是它确实使用了太多的内存。但是我的电脑有32 GB内存的SSD
那么,也许这段代码没有充分利用这个RAM的容量
我怎样才能解决这个问题
编辑:我加了那一行
打印“hello world”
和
打印“hello world2”
检查“hello world”之前的所有部件是否正确运行
我检查了代码打印“hello world”,但没有“hello world2”
所以,看起来很有可能
wb.save(输出路径)
导致问题。openpyxl优化了读取和写入大文件的模式。
wb=Workbook(write\u only=True)
将启用此功能
我还建议您安装lxml以提高速度。这些都包含在文档中。以下是三个备选方案: 循环范围 两个
enumerate()
调用可能会占用内存,因为索引必须发生在嵌套的for循环中。考虑将CSV.Re读器内容传递到列表(订阅),并使用<代码> Range>>()/代码>。尽管不可否认,即使这样做也可能没有效率,因为在Python3中启动每个range()
调用(与不推荐的xrange
相比)也会在内存中生成自己的列表
with open(input_path) as f:
reader = csv.reader(f)
row = []
for data in reader:
row.append(data)
for i in range(len(row)):
for j in range(len(row[0])):
ws.cell(row=i, column=j).value = row[i][j]
优化的编写器
偶数警告说,即使不指定值,滚动单元格也会将其保留在内存中。作为解决方案,您可以使用从csv.reader生成的使用上述行
列表。此路由在仅写工作簿实例中追加整行:
from openpyxl import Workbook
wb = Workbook(write_only=True)
ws = wb.create_sheet()
i = 0
for irow in row:
ws.append(['%s' % j for j in row[j]])
i += 1
wb.save('C:\Path\To\Outputfile.xlsx')
WIN32COM库
最后,考虑使用内置的Wi32 com库,在Excel中打开CSV并保存为。请注意,此软件包仅适用于Python Windows安装
import win32com.client as win32
excel = win32.Dispatch('Excel.Application')
# OPEN CSV DIRECTLY INSIDE EXCEL
wb = excel.Workbooks.Open(input_path)
excel.Visible = False
outxl=r'C:\Path\To\Outputfile.xlsx'
# SAVE EXCEL AS xlOpenXMLWorkbook TYPE (51)
wb.SaveAs(outxl, FileFormat=51)
wb.Close(False)
excel.Quit()
以下是您可以考虑的一些要点:
/tmp
文件夹,该文件夹是创建tmp文件的默认文件夹李>
tmp
文件路径李>
#!/usr/bin/python
import os
import csv
import io
import sys
import traceback
from xlsxwriter.workbook import Workbook
fileNames=sys.argv[1]
try:
f=open(fileNames, mode='r')
workbook = Workbook(fileNames[:-4] + '.xlsx',{'in_memory': True})
worksheet = workbook.add_worksheet()
workbook.use_zip64()
rowCnt=0
#Create the bold style for the header row
for line in f:
rowCnt = rowCnt + 1
row = line.split("\001")
for j in range(len(row)):
worksheet.write(rowCnt, j, row[j].strip())
f.close()
workbook.close()
print ('success')
except ValueError:
print ('failure')
这个文件有多大?@padraiccningham一个是19MB,另一个是32MB。两个都失败了。我认为可以肯定地说,你有足够的内存,总是在保存时出错?@PadraicCunningham“一个保存时出错”是什么意思?可能是因为英语的原因我不理解这一点。我的意思是,只有在执行
wb.save(output\u path)
时才会发生错误,从当前的回溯来看,这似乎是什么happening@Charlie_Clark谢谢你的回复。顺便问一下,我应该如何编辑代码来编写“wb=Workbook(write_only=True)”?我尝试将“wb=openpyxl.Workbook()”替换为“wb=Workbook(write_only=True)”和“wb=openpyxl.Workbook(write_only=True)”,但都失败了。很抱歉,没有代码和文件,我们无法为您提供更多帮助。肯定还有别的事情发生。可能会有问题的一件事是,如果每个单元格都有一个唯一的字符串。但即使是32GB,这也不应该成为问题。