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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:15:36