Python读取电影角色文件生成data class对象列表遇问题求助
问题解决:读取电影角色文件并生成Data Class对象列表并格式化输出
问题说明
需要读取存储电影角色的文件,生成由Data Class对象组成的角色列表,但当前代码仅将每行内容作为字符串存入列表,输出为字符串列表形式,无法得到预期的分栏显示效果,同时不确定Data Class的实现逻辑是否正确。
原代码
import os from dataclasses import dataclass @dataclass class objects(): lst = [] fname: str = 'starwars.txt' lst = [] char = objects() with open(char.fname, "r") as path: # Reads the open file for line in path: x = line[:-1] lst.append(x) print(lst)
当前输出
['Qui-Gon Jinn, Human, Coruscant', 'Han Solo, Human, Corellia', 'Leia Organa, Human, Alderaan', 'Luke Skywalker, Human, Tatooine', 'Chewbacca, Wookiee, Kashyyyk', 'Cassian Andor, Human, Kenari', 'Jar Jar Binks, Gungan, Naboo', 'Ahsoka Tano, Togruta, Shili', 'Plo Koon, Kel Dor, Dorin', 'Din Djarin, Human, Aq Vetina', 'Cad Bane, Duro, Duros', 'Max Rebo, Ortolan, Orto', 'Boba Fett, Human, Kamino', 'Jabba the Hutt, Hutt, Nal Hutta', 'Rey Skywalker, Human, Jakku']
预期输出
Qui-Gon Jinn Human Coruscant Han Solo Human Corellia Leia Organa Human Alderaan Luke Skywalker Human Tatooine Chewbacca Wookiee Kashyyyk Cassian Andor Human Kenari Jar Jar Binks Gungan Naboo Ahsoka Tano Togruta Shili Plo Koon Kel Dor Dorin Din Djarin Human Aq Vetina Cad Bane Duro Duros Max Rebo Ortolan Orto Boba Fett Human Kamino Jabba the Hutt Hutt Nal Hutta Rey Skywalker Human Jakku
修正方案
1. 正确定义Data Class
原代码的Data Class设计错误,应该聚焦定义电影角色的核心属性:
from dataclasses import dataclass @dataclass class StarWarsCharacter: name: str species: str homeworld: str
2. 读取文件生成Data Class对象列表
读取文件时分割每行内容,清洗字段空格后创建角色实例:
character_list = [] fname = 'starwars.txt' with open(fname, "r") as f: for line in f: line = line.strip() if not line: continue # 分割并清洗每个字段的多余空格 name, species, homeworld = [part.strip() for part in line.split(',')] character = StarWarsCharacter(name, species, homeworld) character_list.append(character)
3. 格式化分栏输出
通过指定字段宽度实现对齐的分栏效果:
# 根据最长内容定义各列宽度,保证排版整齐 name_width = 20 species_width = 15 homeworld_width = 15 for char in character_list: print(f"{char.name:<{name_width}}{char.species:<{species_width}}{char.homeworld:<{homeworld_width}}")
完整修正代码
from dataclasses import dataclass @dataclass class StarWarsCharacter: name: str species: str homeworld: str def main(): character_list = [] fname = 'starwars.txt' with open(fname, "r") as f: for line in f: line = line.strip() if not line: continue parts = [part.strip() for part in line.split(',')] if len(parts) == 3: name, species, homeworld = parts character = StarWarsCharacter(name, species, homeworld) character_list.append(character) # 格式化输出 name_width = 20 species_width = 15 homeworld_width = 15 for char in character_list: print(f"{char.name:<{name_width}}{char.species:<{species_width}}{char.homeworld:<{homeworld_width}}") if __name__ == "__main__": main()
说明
- 修正后的Data Class清晰定义角色属性,符合数据类的设计初衷
- 读取阶段增加空行过滤和字段数量检查,提升代码健壮性
- 格式化输出使用左对齐和固定宽度,完美匹配预期的分栏效果
内容的提问来源于stack exchange,提问作者Sodrob Sodrob
相关产品推荐
相关产品推荐

