【问题标题】:Python reading certain values from a csv file into a listPython 将 csv 文件中的某些值读取到列表中
【发布时间】:2017-11-09 22:55:42
【问题描述】:

我在将特定数据从 csv 文件读取到 Python 列表中时遇到了一些问题。下面是我的 csv 文件的示例:

Round 1
Player1  Score  Player2  Score
P1       5      P2       3
P3       2      P4       4
Round 2
Player1  Score  Player2  Score
P1       3      P4       6
Round 3...

(第一轮和第二轮的单元格在顶部合并)

我可以将此 csv 文件中的所有数据附加到一个列表中,但是,我想忽略包含“第 1 轮”的行及其下方包含“Player1”、“Score”等的行和只需附加数据。 “第 2 轮”行和下面的行也是如此。所需的列表将类似于:[[P1, 5, P2, 3][P3, 2, P4, 4][P1, 3, P4, 6]]。下面是我的代码示例:

playerScores = []
with open(scoreFile) as scores
    for row in csv.reader(scores)
        playerScores.append(row)

在我苦苦挣扎时,我将不胜感激任何帮助(PS 我尝试使用“next(scoreFile)”,但是它只为我摆脱了标题“Round 1”)

干杯,

【问题讨论】:

  • 如果row[0] 的值以RoundPlayer 开头,则跳过追加行

标签: python list csv nested


【解决方案1】:

简单的if 条件呢?

playerScores = []
with open(scoreFile) as scores
    for row in csv.reader(scores):
        if row and not row[0].startswith('Round') and not row[0].startswith('Player'):
            playerScores.append(row)

【讨论】:

  • 完美伴侣就像一个魅力!感谢帮助:D
  • 小问题,有没有一种方法可以跳过“第 1 轮”分数而直接从“第 2 轮”开始附加分数?
  • 当然,看第二个答案。
【解决方案2】:

从第 2 轮开始

您可以添加一个新标志later_rounds

playerScores = []
later_rounds = False
with open(scoreFile) as scores:
    for row in csv.reader(scores):
        if row and row[0].startswith('Round 2'):
            later_rounds = True 
        if later_rounds and row and not row[0].startswith('Round') and not row[0].startswith('Player'):
            playerScores.append(row)

或者您可以在另一个循环中跳过开头:

playerScores = []
with open(scoreFile) as scores:
    scoreReader = csv.reader(scores)
    for row in scoreReader:
        if row and row[0].startswith('Round 2'):
            break
    for row in scoreReader:
        if row and not row[0].startswith('Round') and not row[0].startswith('Player'):
            playerScores.append(row) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2019-08-12
    • 1970-01-01
    • 2023-01-25
    • 2021-10-02
    相关资源
    最近更新 更多