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
相关产品推荐
相关产品推荐

