如何创建类批量分析stories文件夹中10个TXT文件的文本指标
批量处理文本分析的问题解决
错误根源
你碰到的「invalid literal for int() with base 10」错误,是因为get_story函数试图把story1这种带字母的字符串转成整数,必然失败。另外现有分析代码写在循环外部,只能处理最后一个读取的文本,完全没利用批量逻辑,TextAnalysis类也没真正用来存储每个文件的分析结果。
修复后的完整代码
from os.path import splitext, basename from glob import glob from nltk.tokenize import sent_tokenize import nltk import zipfile # 下载nltk所需分词资源 nltk.download('punkt') # 解压故事文件包(如果尚未解压) file_name = "stories_n10.zip.2" with zipfile.ZipFile(file_name, 'r') as zip_ref: zip_ref.extractall() def read_file(filename): with open(filename, encoding='utf8') as infile: return infile.read() def get_story_number(filepath): # 从文件名提取数字部分(比如story1.txt -> 1) base = basename(filepath) name_without_ext = splitext(base)[0] # 过滤出字符串中的数字字符并转为整数 return int(''.join(filter(str.isdigit, name_without_ext))) class TextAnalysis: def __init__(self, filename, average_word_length, average_sentence_length): self.filename = filename self.average_word_length = average_word_length self.average_sentence_length = average_sentence_length def __repr__(self): return f"文件: {self.filename} | 平均词长: {self.average_word_length:.2f} | 平均句长: {self.average_sentence_length:.2f}" def analyze_text(text): # 计算单词总数 words = text.split() number_of_words = len(words) if number_of_words == 0: return 0, 0 # 计算总字符数(不含空格) total_letters = sum(len(word) for word in words) # 计算句子总数,处理无句子的边界情况 sentences = sent_tokenize(text) number_of_sentences = len(sentences) if len(sentences) > 0 else 1 # 计算平均值 avg_word_length = total_letters / number_of_words avg_sentence_length = number_of_words / number_of_sentences return avg_word_length, avg_sentence_length # 批量处理所有故事文件 def batch_analyze_stories(): # 匹配stories文件夹下的所有txt文件,若文件在根目录则改为'*.txt' filenames = glob('stories/*.txt') # 按文件名中的数字排序 filenames = sorted(filenames, key=get_story_number) analysis_results = [] for filename in filenames: text = read_file(filename) avg_word_len, avg_sent_len = analyze_text(text) # 实例化分析结果并收集 analysis = TextAnalysis(filename, avg_word_len, avg_sent_len) analysis_results.append(analysis) return analysis_results # 执行批量分析并打印结果 if __name__ == "__main__": results = batch_analyze_stories() for result in results: print(result)
关键修复说明
修复文件名排序错误
- 重写
get_story_number函数,专门提取文件名中的数字部分,避免非数字字符导致的整数转换失败。 - 确保glob匹配路径正确:如果解压后文件直接在根目录,把
stories/*.txt改成*.txt即可。
- 重写
复用分析逻辑
- 将文本分析的核心逻辑封装到
analyze_text函数中,避免重复代码,同时处理了单词数/句子数为0的边界情况(防止除以0报错)。
- 将文本分析的核心逻辑封装到
优化结果存储
- 给
TextAnalysis类添加文件名属性,方便区分每个文件的结果;新增__repr__方法让输出更直观。
- 给
实现批量处理
- 通过
batch_analyze_stories函数完成批量读取、分析、结果收集,循环内每个文件的分析结果都被实例化并存储到列表,最后一次性返回所有结果。
- 通过
内容的提问来源于stack exchange,提问作者tranquile_jonquille
相关产品推荐
相关产品推荐

