再次将保存在CSVfile中的列表转换回列表

2024-09-28 19:24:32 发布

您现在位置:Python中文网/ 问答频道 /正文

希望有人能帮我。 我已经找了几个小时的解决办法,但还是没有找到。你知道吗

所以,我的问题是:

我写了一个脚本,从网上搜集了一些信息。你知道吗

哪些输出是多个列表,如以下列表:

|['Pierre-Emerick Aubameyang', ['172', '114', '19', '9/13', '14', '0', '0', '19', '35', '13702', '22'], [['Borussia Dortmund', '17/18', '8', '10', '1', '2/3', '0', '0', '0', '-', '1', '714', '2'], ['Borussia Dortmund', '16/17', '32', '31', '2', '2/4', '3', '0', '0', '1', '5', '2780', '4'], ['Borussia Dortmund', '15/16', '31', '25', '5', '3/4', '4', '0', '0', '3', '9', '2468', '8'], ['Borussia Dortmund', '14/15', '33', '16', '7', '1/1', '4', '0', '0', '2', '9', '2715', '5'], ['Borussia Dortmund', '13/14', '32', '13', '4', '-/-', '1', '0', '0', '12', '11', '1889', '3'], ['AS St.-Etienne', '12/13', '36', '19', '0', '1/1', '2', '0', '0', '1', '-', '3136', '0']]]|

并将此列表与以下内容一起保存(可能会有所帮助,找到解决方案):

with open('filename.csv', 'w', newline='') as file:
    writer = csv.writer(file, delimiter=",", quotechar='|')
    for pieler in spielers:
        writer.writerow([pieler])

目前我只得到每行作为字符串的行,但我不理解/找不到一个解决方案将它转换成下面提到的列表。你知道吗

最后的结果应该是:

[['Pierre-Emerick Aubameyang', ['172', '114', '19', '9/13', '14', '0', '0', '19', '35', '13702', '22'], [['Borussia Dortmund', '17/18', '8', '10', '1', '2/3', '0', '0', '0', '-', '1', '714', '2'], ['Borussia Dortmund', '16/17', '32', '31', '2', '2/4', '3', '0', '0', '1', '5', '2780', '4'], ['Borussia Dortmund', '15/16', '31', '25', '5', '3/4', '4', '0', '0', '3', '9', '2468', '8'], ['Borussia Dortmund', '14/15', '33', '16', '7', '1/1', '4', '0', '0', '2', '9', '2715', '5'], ['Borussia Dortmund', '13/14', '32', '13', '4', '-/-', '1', '0', '0', '12', '11', '1889', '3'], ['AS St.-Etienne', '12/13', '36', '19', '0', '1/1', '2', '0', '0', '1', '-', '3136', '0']]], ['Robert Lewandowski', ['235', '160', '38', '16/17', '21', '0', '1', '30', '47', '18456', '27'], [['FC Bayern München', '17/18', '8', '9', '0', '3/3', '0', '0', '0', '-', '1', '694', '1'], ['FC Bayern München', '16/17', '33', '30', '6', '5/5', '5', '0', '0', '2', '3', '2776', '9'], ['FC Bayern München', '15/16', '32', '30', '3', '2/2', '2', '0', '0', '3', '3', '2654', '5'], ['FC Bayern München', '14/15', '31', '17', '6', '1/1', '0', '0', '0', '3', '11', '2482', '5'], ['Borussia Dortmund', '13/14', '33', '20', '7', '4/4', '4', '0', '0', '2', '6', '2801', '4'], ['Borussia Dortmund', '12/13', '31', '24', '5', '1/2', '2', '0', '1', '2', '1', '2595', '2'], ['Borussia Dortmund', '11/12', '34', '22', '9', '-/-', '4', '0', '0', '-', '13', '2865', '1'], ['Borussia Dortmund', '10/11', '33', '8', '2', '-/-', '4', '0', '0', '18', '9', '1589', '0']]], [..., [...], [[...], [...], [...]]]]

所以一个列表,其中有更多的列表(每个玩家一个列表)。你知道吗

我要保存到要正确打开的文件中的列表与此类似(jsut中包含更多玩家):

[['Pierre-Emerick Aubameyang', ['172', '114', '19', '9/13', '14', '0', '0', '19', '35', '13702', '22'], [['Borussia Dortmund', '17/18', '8', '10', '1', '2/3', '0', '0', '0', '-', '1', '714', '2'], ['Borussia Dortmund', '16/17', '32', '31', '2', '2/4', '3', '0', '0', '1', '5', '2780', '4'], ['Borussia Dortmund', '15/16', '31', '25', '5', '3/4', '4', '0', '0', '3', '9', '2468', '8'], ['Borussia Dortmund', '14/15', '33', '16', '7', '1/1', '4', '0', '0', '2', '9', '2715', '5'], ['Borussia Dortmund', '13/14', '32', '13', '4', '-/-', '1', '0', '0', '12', '11', '1889', '3'], ['AS St.-Etienne', '12/13', '36', '19', '0', '1/1', '2', '0', '0', '1', '-', '3136', '0']]], ['Robert Lewandowski', ['235', '160', '38', '16/17', '21', '0', '1', '30', '47', '18456', '27'], [['FC Bayern München', '17/18', '8', '9', '0', '3/3', '0', '0', '0', '-', '1', '694', '1'], ['FC Bayern München', '16/17', '33', '30', '6', '5/5', '5', '0', '0', '2', '3', '2776', '9'], ['FC Bayern München', '15/16', '32', '30', '3', '2/2', '2', '0', '0', '3', '3', '2654', '5'], ['FC Bayern München', '14/15', '31', '17', '6', '1/1', '0', '0', '0', '3', '11', '2482', '5'], ['Borussia Dortmund', '13/14', '33', '20', '7', '4/4', '4', '0', '0', '2', '6', '2801', '4'], ['Borussia Dortmund', '12/13', '31', '24', '5', '1/2', '2', '0', '1', '2', '1', '2595', '2'], ['Borussia Dortmund', '11/12', '34', '22', '9', '-/-', '4', '0', '0', '-', '13', '2865', '1'], ['Borussia Dortmund', '10/11', '33', '8', '2', '-/-', '4', '0', '0', '18', '9', '1589', '0']]], ['Martin Harnik', ['312', '102', '6', '3/5', '35', '3', '1', '56', '84', '23110', '17'], [['Hannover 96', '17/18', '8', '5', '0', '-/-', '1', '0', '0', '-', '4', '692', '1'], ['Hannover 96', '16/17', '30', '17', '2', '3/4', '4', '0', '0', '5', '12', '2320', '7'], ['VfB Stuttgart', '15/16', '19', '2', '0', '-/-', '2', '0', '0', '8', '5', '1000', '0'], ['VfB Stuttgart', '14/15', '28', '9', '3', '-/-', '1', '1', '1', '2', '11', '2236', '3'], ['VfB Stuttgart', '13/14', '30', '10', '0', '0/1', '6', '0', '0', '7', '9', '2031', '4'], ['VfB Stuttgart', '12/13', '30', '6', '0', '-/-', '6', '2', '0', '1', '-', '2500', '1'], ['VfB Stuttgart', '11/12', '34', '17', '1', '-/-', '4', '0', '0', '1', '12', '2768', '1'], ['VfB Stuttgart', '10/11', '32', '8', '0', '-/-', '7', '0', '0', '15', '5', '1877', '0'], ['Fortuna Düsseldorf', '09/10', '30', '13', '0', '-/-', '3', '0', '0', '1', '9', '2571', '0'], ['SV Werder Bremen', '08/09', '8', '0', '0', '-/-', '0', '0', '0', '6', '-', '318', '0'], ['SV Werder Bremen II', '08/09', '8', '1', '0', '-/-', '1', '0', '0', '-', '3', '704', '0'], ['SV Werder Bremen', '07/08', '9', '1', '0', '-/-', '0', '0', '0', '6', '2', '298', '0'], ['SV Werder Bremen II', '07/08', '12', '3', '0', '-/-', '0', '0', '0', '-', '3', '1038', '0'], ['SV Werder Bremen II', '06/07', '21', '8', '0', '-/-', '0', '0', '0', '4', '6', '1596', '0'], ['SV Werder Bremen II', '05/06', '13', '2', '0', '-/-', '0', '0', '0', '-', '3', '1161', '0']]], ['Mark Uth', ['152', '76', '12', '5/5', '15', '0', '0', '34', '55', '10458', '5'], [['TSG 1899 Hoffenheim', '17/18', '7', '5', '0', '-/-', '0', '0', '0', '1', '2', '533', '1'], ['TSG 1899 Hoffenheim', '16/17', '22', '7', '3', '-/-', '4', '0', '0', '10', '8', '1155', '1'], ['TSG 1899 Hoffenheim II', '16/17', '1', '1', '0', '-/-', '0', '0', '0', '-', '1', '58', '1'], ['TSG 1899 Hoffenheim', '15/16', '25', '8', '1', '-/-', '2', '0', '0', '9', '8', '1405', '2'], ['SC Heerenveen', '14/15', '32', '15', '8', '3/3', '6', '0', '0', '-', '15', '2664', '0'], ['1. FC Köln', '11/12', '-', '0', '0', '-/-', '0', '0', '0', '-', '-', '-', '0'], ['1. FC Köln II', '11/12', '15', '9', '0', '-/-', '3', '0', '0', '2', '2', '1179', '0'], ['1. FC Köln', '10/11', '-', '0', '0', '-/-', '0', '0', '0', '-', '-', '-', '0'], ['1. FC Köln II', '10/11', '23', '7', '0', '1/1', '0', '0', '0', '8', '5', '1473', '0'], ['1. FC Köln', '09/10', '24', '24', '0', '1/1', '0', '0', '0', '1', '14', '1938', '0'], ['1. FC Köln II', '09/10', '3', '0', '0', '-/-', '0', '0', '0', '3', '-', '53', '0'], ['SCB Viktoria Köln 1994', '06/07', '-', '0', '0', '-/-', '0', '0', '0', '-', '-', '-', '0']]]]

谢谢你们的帮助,伙计们!你知道吗

来自德国的问候

编辑

我找到了解决问题的方法:

with open('filename.csv', 'r', newline='') as file:
    reader = csv.reader(file, delimiter=",", quotechar='|')
    for row in reader:
        for i in row:
            part1 = i.replace("[","").split(",", 1)
            name = part1[0].replace("'","")
            part2 = part1[1].split("],", 1)
            part3 = part2[1].split("],")
            player_games = []
            for ii in part3:
                player_games.append(ii.replace("]", "").replace("'", "").split(","))
            total_player = [name, zweite[0].replace("'", "").split(",")]
            total_player.append(player_games)
            liste.append(total_player)

这个很好用,但我认为有一个更好的。。。。你知道吗


Tags: 列表replaceiiplayerfclnsvbremen
1条回答
网友
1楼 · 发布于 2024-09-28 19:24:32

首先,list[ list[ str, list[str], list[ list[str] ] ] ]在语义上是一种非常糟糕的数据存储格式。现在您可能知道数据的每一部分是什么,但您可能应该将内部列表转换为一些更具语义的容器,例如collections.namedtuple或甚至dicts。此外,每个播放器的第二个元素只是第三个元素的直接相加,因此可以避免将其存储在文件中以节省磁盘空间。我建议使用list[ collections.OrderedDict{ str: collections.OrderedDict{ str: collections.namedtuple(str, int, ...) } } ]

from collections import namedtuple, OrderedDict

Stats = namedtuple('Stats', ['team', 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's10', 's11', 's12'])

“s1”-“s12”是整数,表示每个季节列表的最后11个数字,因为其中一个当前被表示为“-/-”,我将其拆分为2。我不知道它们代表哪种状态,你应该使用更有意义的名称,比如“进球”、“比赛”等。例如,皮埃尔·埃默里克·奥巴梅扬的17/18赛季将是Stats(team='Borussia Dortmund', s1=8, s2=10, s3=1, s4=2, s5=3, s6=0, s7=0, s8=0, s9=None, s10=1, s11=714, s12=2) 季节(即‘17/18’)不会存储在这个元组中,因为它将是保存这个元组的字典的键。你知道吗

考虑到'-'的特殊情况,要将字符串解析为整数,我们需要一个函数:

def parseToInt(value):
    ''' Returns the value parsed to int or None if it can't be parsed '''
    try:
        return int(value)
    except ValueError:
        return None

如果你不喜欢用None而不是“-”,你可以把最后一行换成return value,但是我发现用None更适合Pythonic。稍后还需要修改filter第一个参数。你知道吗

一旦我们设置好所有这些,并使用如下数据示例:

spielers = [
            [
             'Pierre-Emerick Aubameyang',
             ['172', '114', '19', '9/13', '14', '0', '0', '19', '35', '13702', '22'],
             [
              ['Borussia Dortmund', '17/18', '8', '10', '1', '2/3', '0', '0', '0', '-', '1', '714', '2'],
              ['Borussia Dortmund', '16/17', '32', '31', '2', '2/4', '3', '0', '0', '1', '5', '2780', '4'],
              ['Borussia Dortmund', '15/16', '31', '25', '5', '3/4', '4', '0', '0', '3', '9', '2468', '8'],
              ['Borussia Dortmund', '14/15', '33', '16', '7', '1/1', '4', '0', '0', '2', '9', '2715', '5'],
              ['Borussia Dortmund', '13/14', '32', '13', '4', '-/-', '1', '0', '0', '12', '11', '1889', '3'],
              ['AS St.-Etienne', '12/13', '36', '19', '0', '1/1', '2', '0', '0', '1', '-', '3136', '0']
             ]
            ],
            [
             'Robert Lewandowski',
             ['235', '160', '38', '16/17', '21', '0', '1', '30', '47', '18456', '27'],
             [
              ['FC Bayern München', '17/18', '8', '9', '0', '3/3', '0', '0', '0', '-', '1', '694', '1'],
              ['FC Bayern München', '16/17', '33', '30', '6', '5/5', '5', '0', '0', '2', '3', '2776', '9'],
              ['FC Bayern München', '15/16', '32', '30', '3', '2/2', '2', '0', '0', '3', '3', '2654', '5'],
              ['FC Bayern München', '14/15', '31', '17', '6', '1/1', '0', '0', '0', '3', '11', '2482', '5'],
              ['Borussia Dortmund', '13/14', '33', '20', '7', '4/4', '4', '0', '0', '2', '6', '2801', '4'],
              ['Borussia Dortmund', '12/13', '31', '24', '5', '1/2', '2', '0', '1', '2', '1', '2595', '2'],
              ['Borussia Dortmund', '11/12', '34', '22', '9', '-/-', '4', '0', '0', '-', '13', '2865', '1'],
              ['Borussia Dortmund', '10/11', '33', '8', '2', '-/-', '4', '0', '0', '18', '9', '1589', '0']
             ]
            ]
           ]

我们可以解析原始数据并将其存储在这样一个文件中:

players = OrderedDict()
for spieler in spielers: # spieler = ['Pierre-Emerick Aubameyang', [...], [...]]
    stats = OrderedDict()
    for season in spieler[2]: # season = ['Borussia Dortmund', ...]
        while season[1] in stats:
            season[1] += "*"
        stats[season[1]] = Stats(season[0], *list(map(parseToInt, season[2:5] + season[5].split('/') + season[6:])))
    players[spieler[0]] = stats

with open('players.json', 'w') as f:
    json.dump(players, f)

要重新加载数据,我们可以执行以下操作:

from collections import namedtuple, OrderedDict

Stats = namedtuple('Stats', ['team', 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's10', 's11', 's12'])

with open('players.json', 'r') as f:
    players = json.load(f, object_pairs_hook=OrderedDict)

for name, all_stats in loaded_players.items():
    for season, stats in all_stats.items():
        all_stats[season] = Stats(*stats)

请看一下代码,如果您不理解任何部分,请给出注释,以便我进一步解释。你知道吗

编辑

要操作数据,您可以执行以下操作:

1)计算职业生涯统计数据并在表格中显示:

print(" {:^25} | {:^3} | {:^3} | {:^2} | {:^5} | {:^2} | {:^2} | {:^2} | {:^2} | {:^3} | {:^5} | {:^3} ".format('Name', 's1', 's2', 's3', 's4/s5', 's6', 's7', 's8', 's9', 's10', 's11', 's12'))
print("-"*27+"+"+"-"*5+"+"+"-"*5+"+"+"-"*4+"+"+"-"*7+"+"+"-"*4+"+"+"-"*4+"+"+"-"*4+"+"+"-"*4+"+"+"-"*5+"+"+"-"*7+"+"+"-"*5)
for name, stats in loaded_players.items():
    print(" {:<25} | {:3} | {:3} | {:2} | {:2}/{:2} | {:2} | {:2} | {:2} | {:2} | {:3} | {:5} | {:3} ".format(
        name,
        sum(filter(None, map(lambda x: x.s1, stats.values()))),
        sum(filter(None, map(lambda x: x.s2, stats.values()))),
        sum(filter(None, map(lambda x: x.s3, stats.values()))),
        sum(filter(None, map(lambda x: x.s4, stats.values()))),
        sum(filter(None, map(lambda x: x.s5, stats.values()))),
        sum(filter(None, map(lambda x: x.s6, stats.values()))),
        sum(filter(None, map(lambda x: x.s7, stats.values()))),
        sum(filter(None, map(lambda x: x.s8, stats.values()))),
        sum(filter(None, map(lambda x: x.s9, stats.values()))),
        sum(filter(None, map(lambda x: x.s10, stats.values()))),
        sum(filter(None, map(lambda x: x.s11, stats.values()))),
        sum(filter(None, map(lambda x: x.s12, stats.values())))
    ))

statscollections.OrderedDict,因此我们将其值传递给map()函数,该函数提取所需的stat(由.访问,因为它是collections.namedtuple)。这将为每个季节生成一个包含所需统计信息的列表,然后filter()删除None元素并sum()将其添加。这样我们就避免了像您这样存储计算出的值。你知道吗

2)列出球员职业生涯中参加过的球队:

for name, stats in loaded_players.items():
    print("- {:25}: {}".format(
        name,
        ", ".join(set(map(lambda x: x.team, stats.values())))
    ))

我们像以前一样提取带有“map()”和“lambda”的团队,将其转换为一个集合以删除重复项,并通过“,”将它们连接起来以获得逗号分隔的字符串。你知道吗

3)打印全部数据:

print("{")
for name, all_stats in loaded_players.items():
    print("  {}: ".format(name) + "{")
    for season, stats in all_stats.items():
        print("    {}: {},".format(season, stats))
    print("  },")
print("}")

相关问题 更多 >