向TXT文件追加内容失败:读写同一文件时无法写入分词结果
问题分析与解决
你遇到的问题是:用r+模式读写2289newsML.txt时,能正常打印分词后的内容,但无法将其写入文件。先看看你的原代码片段:
from pathlib import Path from nltk.tokenize import word_tokenize news_folder = Path("file\\path\\") news_file = (news_folder / "2289newsML.txt") f = open(news_file, 'r+') data = f.readlines() # 这里应该有分词处理的代码,比如: tokenized_data = [] for line in data: tokens = word_tokenize(line.strip()) tokenized_data.append(' '.join(tokens)) print(tokenized_data) # 能正常打印,但写入没效果 # 假设你这里有写入代码,比如f.write('\n'.join(tokenized_data))
为什么写入没效果?
主要是r+模式的特性导致的:
- 用
r+打开文件后,调用readlines()会把文件指针移到文件末尾,此时直接写入的话,内容会追加到原文件后面,但这不符合你“仅保存分词版本”的需求。 - 另外,如果没有手动调用
f.close()或者f.flush(),操作系统可能不会立即把内存中的内容写入磁盘,看起来就像没写入一样。
两种可行的解决方案
方案1:分开读写(更安全推荐)
先读取文件内容,关闭文件后,再用w模式打开写入,这样能避免读写指针混乱的问题:
from pathlib import Path from nltk.tokenize import word_tokenize news_folder = Path("file\\path\\") news_file = news_folder / "2289newsML.txt" # 第一步:读取并处理内容 with open(news_file, 'r', encoding='utf-8') as f: data = f.readlines() tokenized_lines = [] for line in data: # 去掉首尾空白后分词,再用空格拼接成字符串 tokens = word_tokenize(line.strip()) tokenized_lines.append(' '.join(tokens)) # 第二步:写入处理后的内容(覆盖原文件) with open(news_file, 'w', encoding='utf-8') as f: f.write('\n'.join(tokenized_lines))
用with语句的好处是会自动关闭文件,不用手动调用close(),避免资源泄漏。
方案2:同一文件内操作(需注意指针位置)
如果一定要在同一个文件句柄里完成读写,需要手动移动指针并截断原内容:
from pathlib import Path from nltk.tokenize import word_tokenize news_folder = Path("file\\path\\") news_file = news_folder / "2289newsML.txt" with open(news_file, 'r+', encoding='utf-8') as f: # 读取内容 data = f.readlines() # 处理分词 tokenized_lines = [] for line in data: tokens = word_tokenize(line.strip()) tokenized_lines.append(' '.join(tokens)) # 把指针移回文件开头 f.seek(0) # 截断文件(删除原内容) f.truncate() # 写入分词后的内容 f.write('\n'.join(tokenized_lines))
这样处理后,文件里就只会保存分词后的版本啦。
内容的提问来源于stack exchange,提问作者The BrownBatman
相关产品推荐
相关产品推荐

