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

Python中将字符串转为数组及解决readline属性错误问题

嘿,我来帮你搞定这个报错问题!

问题根因

你碰到的 AttributeError: 'unicode' object has no attribute 'readline' 其实很直白:txt 是一个字符串(unicode对象),但你却在调用只有文件句柄才有的 readline() 方法。因为你用 f.read() 把整个文件的内容一次性读成了一个大字符串,而不是保持文件句柄的可迭代状态。

两种解决方案(适配你的Gutenberg电子书处理场景)

方案1:直接逐行遍历文件句柄(推荐,内存更友好)

如果你的逻辑不需要先把整个文件读进内存,可以直接遍历打开的文件对象——它本身就是可迭代的,每次返回一行内容:

def de_gutenberger(filename):
    with open(filename, 'r', encoding='utf-8') as f:  # Python3用r模式+指定编码更省心
        # 先处理作者和标题?如果需要先读全量文本,那看方案2
        # 直接逐行遍历
        for line in f:
            # 在这里处理每一行,比如清洗、提取数据
            cleaned_line = line.strip()
            if cleaned_line:
                print(cleaned_line)

方案2:已读全量文本,分割成行列表再遍历

如果你必须先读全量文本(比如要定位Gutenberg的START/END标记),那就把字符串按换行符分割成行的列表,再遍历:

import re

def de_gutenberger(filename):
    with open(filename, 'r', encoding='utf-8') as f:
        txt = f.read()  # 直接读成字符串(Python3)
    
    author, title = get_author_and_title(txt)
    
    # 定位正文范围(用re.escape避免正则特殊字符坑)
    start_mark = re.escape("START OF THIS PROJECT GUTENBERG EBOOK")
    end_mark = re.escape("END OF THIS PROJECT GUTENBERG EBOOK")
    
    start_pos = re.search(start_mark, txt).end()
    end_pos = re.search(end_mark, txt).start()
    
    # 提取正文并分割成行
    content_lines = txt[start_pos:end_pos].splitlines()
    
    # 遍历每一行处理
    for line in content_lines:
        # 你的数组提取逻辑,比如:
        # if line matches your pattern, append to array
        pass

小Tips

  • 用 re.escape() 包裹你的标记字符串:避免万一标记里有正则特殊字符(比如*)导致匹配失败
  • 编码处理:Python3尽量用 'r' 模式+encoding参数,直接读成字符串,不用手动解码
  • 别搞混对象类型:文件对象有readline()/readlines(),字符串只有splitlines()这类分割方法

内容的提问来源于stack exchange,提问作者naveen gullipalli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:30:06