You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django/Python中CSV列表不区分大小写搜索及跨系统兼容问题

解决CSV跨系统兼容与Django不区分大小写搜索问题

一、修复CSV跨系统解析错误

你之前的代码在WSL Ubuntu下失效,核心问题有两个:

  1. 错误地将csv.reader返回的列表转成字符串再拆分,导致元素格式混乱(比如带单引号、方括号)
  2. 未处理不同系统的CSV换行符差异,也没正确指定Excel生成CSV的分隔符(Excel在部分地区会用分号代替逗号)

正确的CSV读取方式

Python的csv模块本身支持自动处理跨系统换行符,只需打开文件时指定newline='',同时根据CSV实际分隔符设置delimiter:

with open(obj.file_name.path, 'r', newline='', encoding='utf-8') as f:
    next(f)  # 跳过表头行
    # 若CSV用逗号分隔则改为delimiter=','
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        if not row:  # 跳过空行
            continue
        # row已经是解析好的元素列表,直接使用即可
        result.append(row)
  • newline='':让csv.reader自动识别Windows(\r\n)、Mac(\r)、Linux(\n)的换行符
  • encoding='utf-8':避免特殊字符/中文乱码,若CSV是GBK编码可改为encoding='gbk'
  • 直接用row列表:无需额外str(row).split(','),这会破坏csv.reader的解析结果

二、实现不区分大小写的列表搜索与Django查询

1. 列表内不区分大小写搜索

如果要在result列表中按产品名称不区分大小写查找,用列表推导式即可:

  • 精确匹配:
target_product = "Apple"
matching_rows = [row for row in result if row[2].strip().lower() == target_product.lower()]
  • 模糊匹配(包含关键词):
target_product = "app"
matching_rows = [row for row in result if target_product.lower() in row[2].strip().lower()]

2. Django模型不区分大小写查询

你已经用到了name__iexact=product,这是Django提供的不区分大小写精确匹配查询,只需确保product字符串先做清理:

# 先清理产品名称:去除前后空格+统一转小写
clean_product = product.strip().lower()
try:
    product_obj = Product.objects.get(name__iexact=clean_product)
except Product.DoesNotExist:
    product_obj = None

如果需要模糊匹配,可改用name__icontains=clean_product。

三、完整修正后的视图代码

def csv_upload_view(request):
    print('file is being uploaded')

    if request.method == 'POST':
        csv_file = request.FILES.get('file')
        obj = CSV.objects.create(file_name=csv_file)
        result = []

        # 处理跨系统换行符+指定编码
        with open(obj.file_name.path, 'r', newline='', encoding='utf-8') as f:
            next(f)  # 跳过表头
            # 根据CSV实际分隔符调整delimiter
            reader = csv.reader(f, delimiter=';')
            for row in reader:
                if not row:
                    continue
                result.append(row)

                transaction_id = row[1]
                # 清理产品名称
                product = row[2].strip().lower()
                quantity = row[3]
                customer = row[4]
                date = parse_date(row[5])

                try:
                    # 不区分大小写精确匹配
                    product_obj = Product.objects.get(name__iexact=product)
                except Product.DoesNotExist:
                    product_obj = None
                
                print(product_obj)

    return HttpResponse()

内容的提问来源于stack exchange,提问作者sloth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:25:23