Django/Python中CSV列表不区分大小写搜索及跨系统兼容问题
解决CSV跨系统兼容与Django不区分大小写搜索问题
一、修复CSV跨系统解析错误
你之前的代码在WSL Ubuntu下失效,核心问题有两个:
- 错误地将
csv.reader返回的列表转成字符串再拆分,导致元素格式混乱(比如带单引号、方括号) - 未处理不同系统的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
相关产品推荐
相关产品推荐

