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

如何在LangChain中拆分读取的CSV文件?

解决方案

问题原因分析

  • csv.reader返回的是迭代器,而非字符串或字符串列表,RecursiveCharacterTextSplitter.create_documents()需要接收字符串序列,且迭代器本身没有len()方法,导致第一个报错。
  • 当尝试用"".join(test)时,代码已跳出with代码块,文件对象被自动关闭,迭代器无法再读取内容,因此触发I/O operation on closed file错误。

正确处理步骤

1. 读取CSV并转换为字符串列表

在with代码块内完成CSV内容的读取和转换,把每行数据拼接成字符串后存入列表:

import csv
from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, 
                                              chunk_overlap=20, 
                                              length_function=len)

# 在with块内完成读取和转换
with open("test.csv") as f:
    csv_reader = csv.reader(f, delimiter=",")
    # 将CSV每行的单元格用逗号拼接成字符串,存入列表
    csv_texts = [",".join(row) for row in csv_reader]

# 调用拆分方法处理字符串列表
documents = text_splitter.create_documents(csv_texts)

2. 将整个CSV作为单一文本拆分

如果希望把整个CSV内容合并成一个大字符串再拆分,同样要在with块内完成读取:

import csv
from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, 
                                              chunk_overlap=20, 
                                              length_function=len)

with open("test.csv") as f:
    csv_reader = csv.reader(f, delimiter=",")
    # 合并所有行,每行之间加换行符区分
    full_text = "\n".join([",".join(row) for row in csv_reader])

# 传入单元素字符串列表进行拆分
documents = text_splitter.create_documents([full_text])

关键注意点

  • 必须在with代码块内完成CSV迭代器的遍历(比如转换为列表或字符串),因为with块结束后文件会自动关闭,迭代器无法再访问。
  • create_documents()方法接收的参数是字符串列表,需将CSV内容转换为字符串序列后再传入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:44:55