如何用Python Pandas将多TXT文件数据合并为单个DataFrame并展示
解决方法
你的问题核心是每次循环都覆盖了books变量,导致最后只保留了最后一个文件的DataFrame。要合并成单个DataFrame,你可以先收集所有书籍的数据,最后再统一生成DataFrame,具体有两种常用方式:
方式一:用列表存储字典(推荐,效率更高)
import re import pandas as pd from glob import glob files = glob('dataset/*.txt') files.sort() # 创建空列表存储每本书的信息字典 book_list = [] # 提前编译正则表达式,避免循环内重复编译提升效率 title_pattern = re.compile(r'Title: (.*)\n') author_pattern = re.compile(r'Author: (.*)\n') release_date_pattern = re.compile(r'Release Date: (.*)\s') language_pattern = re.compile(r'Language: (.*)\n') for n in files: with open(n, 'r') as text_file: text = text_file.read() # 提取信息,增加异常判断避免个别文件格式异常导致报错 book_title = title_pattern.search(text).group(1) if title_pattern.search(text) else None # 取消下方注释即可启用作者字段提取 # book_author = author_pattern.search(text).group(1) if author_pattern.search(text) else None book_author = None # 临时占位,可替换为上面的注释行 book_language = language_pattern.search(text).group(1) if language_pattern.search(text) else None book_release = release_date_pattern.search(text).group(1).split(' [')[0] if release_date_pattern.search(text) else None # 将当前书籍信息存入字典并添加到列表 book_list.append({ "Title": book_title, "Author": book_author, "Release_Date": book_release, "Language": book_language }) # 将列表转换为单个DataFrame books_df = pd.DataFrame(book_list) # 展示结果 books_df
方式二:用列表存储小DataFrame,最后合并
import re import pandas as pd from glob import glob files = glob('dataset/*.txt') files.sort() # 创建空列表存储每个文件对应的小DataFrame df_list = [] title_pattern = re.compile(r'Title: (.*)\n') author_pattern = re.compile(r'Author: (.*)\n') release_date_pattern = re.compile(r'Release Date: (.*)\s') language_pattern = re.compile(r'Language: (.*)\n') for n in files: with open(n, 'r') as text_file: text = text_file.read() book_title = title_pattern.search(text).group(1) if title_pattern.search(text) else None # book_author = author_pattern.search(text).group(1) if author_pattern.search(text) else None book_author = None book_language = language_pattern.search(text).group(1) if language_pattern.search(text) else None book_release = release_date_pattern.search(text).group(1).split(' [')[0] if release_date_pattern.search(text) else None # 生成当前书籍的小DataFrame并添加到列表 single_book_df = pd.DataFrame({ "Title": [book_title], "Author": [book_author], "Release_Date": [book_release], "Language": [book_language] }) df_list.append(single_book_df) # 合并所有小DataFrame books_df = pd.concat(df_list, ignore_index=True) # 展示结果 books_df
额外优化提示
- 把正则表达式编译放在循环外,避免重复编译,处理1000个文件时能明显提升效率
- 增加的格式异常判断,可防止个别不符合规则的文件导致代码中断
内容的提问来源于stack exchange,提问作者watch dog
相关产品推荐
相关产品推荐

