如何在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
相关产品推荐
相关产品推荐

