Python 将txt转换为xlsx时的MemoryError

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(

相关问题: 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()
            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,这也不应该成为问题。