You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决字符串无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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:50:33