如何解决字符串无readlines属性报错及写入文件后读空问题?
问题分析与解决
一、写入文件后读取空行的原因
- 你调用
text_file.close时没加括号,这只是引用方法而非执行关闭操作,导致文件内容没真正写入磁盘。正确写法是text_file.close() - 若使用
w+模式写完后直接读取,文件指针会停在末尾,也会读到空内容,但你这里核心问题是未执行关闭操作
二、字符串无法传入lines函数的解决思路
lines函数依赖文件对象的readlines方法,直接传字符串会触发属性错误。无需写入文件,用io.StringIO把字符串包装成类文件对象,就能直接适配lines函数的需求,更高效简洁。
三、代码优化点
- 变量名别用
list这类内置关键字,改成chars避免冲突 changed_document里的document_changed赋值放在循环内部完全冗余,应在循环结束后一次性拼接字符- 文件操作优先用
with语句,自动管理文件关闭,避免资源泄漏 reading函数里docu = doc是多余代码,直接返回doc即可- 文件对象读取一次后指针会移到末尾,需用
seek(0)重置指针,避免后续读不到内容
修改后的完整代码
import io def reading(): doc = open("C:/Users/s.txt", "r", encoding='utf-8') return doc def longest_word_place(document): words = document.read().split() max_len = 0 max_place = 0 for idx, word in enumerate(words): if len(word) > max_len: max_len = len(word) max_place = idx return max_place def changed_document(document): chars = [] document.seek(0) # 重置文件指针到开头,避免之前的read()导致后续读空 for line in document: for symbol in line: if symbol.isnumeric(): symbol = ' ' if symbol in "#,.;«\³][:¡|>^' '<?+=_-)(*&^%$£!`": symbol = ' ' chars.append(symbol) document_changed = ''.join(chars) return document_changed def lines(document): lines = document.readlines() max_word = '' max_line = 0 for line_index, every_line in enumerate(lines, 1): line_words = every_line.strip().split() for each_word in line_words: if len(each_word) > len(max_word): max_word = each_word max_line = line_index print(f"{max_word = }, {max_line = }") # 主逻辑 document = reading() ch_dok = changed_document(document) document.close() # 关闭原文件 # 修复写入文件后读取空的问题 with open("C:/Users/changed_doc.txt", "w", encoding='utf-8') as text_file: text_file.write(ch_dok) # 验证写入的文件内容 with open("C:/Users/changed_doc.txt", "r", encoding='utf-8') as doc1: for line1 in doc1: print(line1) # 直接将字符串传入lines函数的正确方式 string_file = io.StringIO(ch_dok) lines(string_file) string_file.close()
关键说明
io.StringIO(ch_dok)将字符串包装成支持readlines方法的类文件对象,完美适配lines函数的参数要求with语句自动处理文件关闭,无需手动调用close(),更安全可靠document.seek(0)解决了文件指针偏移导致的读空问题,确保changed_document能读取到文件内容
内容的提问来源于stack exchange,提问作者Luka
相关产品推荐
相关产品推荐

