如何用Dask将带URL的双换行分隔TXT读为两列DataFrame
Dask读取纽约时报TXT文本构建双列DataFrame的适配方案
原有读取逻辑的问题定位
- 之前使用的
dd.read_csv(filename,sep="\n\n",header=None,engine='python')代码无法生效的核心原因:文件结构中,单篇文章内部URL与正文的空行分隔、不同文章之间的空行分隔使用了完全相同的\n\n换行规则。直接把\n\n当成分隔符时,会把单篇文章拆成两个独立的文本块,完全无法建立URL和对应正文的绑定关系,最终只会得到无结构的单列文本,甚至会把正文内的单换行段落识别为独立行。
可直接落地的实现步骤
第一步:按文章的URL起始标记拆分独立文本块
绕开read_csv的固定分隔逻辑,用Dask的文本读取接口,以每行开头的URL:标记为拆分边界,确保每一个文本块完整包含某篇文章的URL链接和对应全部正文内容,不会被中间的空行拆散。
参考代码:import dask.dataframe as dd import re # 加载原始文本并按URL起始标记拆分独立文章块 raw_ddf = dd.read_text( file_path, include_path=False, blocksize="100MB" # 大文件场景下设置分块大小,利用Dask并行能力 ) # 用正向前瞻正则,在每个URL行之前做切分,保证块内结构完整 article_blocks = raw_ddf.str.cat(sep="\n").str.split(r'(?=^URL:)', flags=re.M).explode().str.strip()第二步:对每个文章块拆分出URL、正文两列
利用块内的固定结构(URL行开头、后续紧跟空行、之后是带单换行段落的正文),通过正则捕获分别提取两个字段,过程中保留正文内部的单换行格式,不做额外拆分:# 提取URL字段:匹配“URL:”前缀后的链接内容 url_col = article_blocks.str.extract( r'^URL:\s*(.*?)\n', flags=re.M )[0].rename("article_url") # 提取正文字段:跳过URL行和紧跟的空行,保留后续所有正文内容 content_col = article_blocks.str.extract( r'^URL:.*?\n\s*\n(.*)', flags=re.M | re.S # 支持换行匹配,保留正文段落格式 )[0].str.strip().rename("article_content") # 合并为目标双列DataFrame,清理空块 final_ddf = dd.concat([url_col, content_col], axis=1).dropna(how="all")
关键注意事项
- 不要用
read_csv的固定换行分隔做拆分,两层相同的分隔符规则会直接破坏单篇文章的块结构 - 提取正文时必须配合
re.S正则标记,确保换行符可以被正则匹配,避免只提取到第一段正文 - 单换行分隔的正文段落属于同一条记录的内容,不要在提取过程中做拆分,否则会出现行错位
内容的提问来源于stack exchange,提问作者yacine Acheroufkebir
相关产品推荐
相关产品推荐

