Skip to main content
 首页 » 编程设计

python之将 xls 转换为 csv 并创建/更新 InMemoryUploadedFile Django

2025年05月04日36wuhuacong

我正在使用 python 的 xlrd 和 csv 将 xls 解析为 csv。当用户上传 xls 或 xlsx 文件时,我能够解析并生成 csv。虽然它生成实际文件,但我想更新或创建新的 InMemoryUploadFile 对象,我可以使用它来创建带有 FileField 对象的记录。有什么办法吗?我试图寻找示例,尽管大多数示例都是针对 InMemoryUploadFile 的图像文件。

这是我试过的示例代码-

    import csv 
    import xlrd 
    import StringIO 
    from django.core.files.uploadedfile import InMemoryUploadedFile         
    ....... 
    ....... 
 
    #xls_file is excel file 
    file_name = '%s.csv'%(xls_file.name) 
    workbook = xlrd.open_workbook(file_contents=xls_file.read()) 
    all_worksheets = workbook.sheet_names() 
 
    # for now starting with reading the first sheet 
    worksheet_name = all_worksheets[0] 
    worksheet = workbook.sheet_by_name(worksheet_name) 
 
    csv_output = StringIO.StringIO() 
    csv_data = [] 
    for rownum in xrange(worksheet.nrows): 
        csv_data.append( 
            [unicode( 
                entry).encode("utf-8") for entry in worksheet.row_values( 
                rownum)]) 
    writer = csv.writer(csv_output) 
    for row in csv_data: 
        writer.writerow(csv_data) 
 
    csv_file = InMemoryUploadedFile(writer, None, file_name, 'text/csv', 
                              None, 'utf-8') 
    return csv_file 

请您参考如下方法:

您可以尝试改用 ContentFile 吗?

from django.core.files.base import ContentFile 
def save_file(csv_output): 
    mymodel = MyModel.objects.get(id=1) 
    file_content = ContentFile(csv_output.getvalue()) 
    mymodel.myfilefield.save(request.FILES['yourupload'].name, file_content)