繁体   English   中英

在python列表中读取和获取特定文件内容

[英]Reading and taking specific file contents in a list in python

我有一个文件包含:

name: Sam
placing: 2
quote: I'll win.

name: Jamie
placing: 1
quote: Be the best.

我想通过python读取文件,并将特定内容附加到列表中。 我希望我的第一个列表包含:

rank = [['Sam', 2],['Jamie', 1]]

第二个列表包含:

quo = ['I'll win','Be the best']

首先,我开始通过以下方式读取文件:

def read_file():
    filename = open("player.txt","r")
    playerFile = filename
    player = []   #first list
    quo = []   #second list

    for line in playerFile:   #going through each line 
        line = line.strip().split(':')  #strip new line 
        print(line) #checking purpose
        player.append(line[1])     #index out of range
        player.append(line[2])
        quo.append(line[3])

我在第一个附录中得到的索引超出范围。 我已用':'分开,但似乎无法访问它。

当您执行line = line.strip()。split(':')时,当line =“ name:Sam”时,您会收到['name','Sam'],因此应先执行附加操作。

第二个player.append(line [2]将不起作用。

正如zython在评论中所说,您需要了解文件的格式以及文件中的每个空白行或其他更改,这会使脚本失败。

您应该对文件进行不同的分析:如果可以依靠“名称”和“引号”始终是每个播放器数据中现有字段的事实,则应查找此字段名称。

例如:

for line in file:
# Run on each line and insert to player list only the lines with "name" in it
    if ("name" in line):
    # Line with "name" was found - do what you need with it
    player.append(line.split(":")[1])

一些问题,

  • 该程序试图在for循环的单次迭代中读取三行数据。 但这是行不通的,因为循环和split命令在每次迭代中仅解析一行。 要从文件中读取一个条目,将需要进行三个循环迭代。
  • 该程序需要处理空白行。 通常,当读取这样的文件时,您可能需要大量错误处理,数据通常格式不正确。 我的建议是检查空行,其中line只有一个值,它是一个空字符串。 看到该行时,请忽略该行。
  • 该程序需要收集每个条目的第一行和第二行,并将它们放入一个临时数组,然后将该临时数组附加到player 因此,您需要在上面声明该临时数组,首先使用name字段填充,然后使用placing字段填充,最后将其附加到player
  • 从零开始的索引。 请记住,数组的第一项是list[0]而不是list[1]

试试这个代码:

def read_file():
    filename = open("player.txt", "r")
    playerFile = filename
    player = []
    rank = []
    quo = []

    for line in playerFile:
        value = line.strip().split(": ")
        if "name" in line:
            player.append(value[1])
        if "placing" in line:
            player.append(value[1])
        if "quote" in line:
            quo.append(value[1])
            rank.append(player)
            player = []

    print(rank)
    print(quo)    

read_file()

我认为您对如何检查行并将行中的内容基于行包含的内容添加到两个列表感到困惑。 您可以使用in来检查当前所在的行。 假设您的文本文件与问题文件相同,则此方法有效。

rank, quo = [], []
for line in playerFile: 
    splitted = line.split(": ")
    if "name" in line:
        name = splitted[1]
    elif "placing" in line:
        rank.append([name, splitted[1]])
    elif "quote" in line:
        quo.append(splitted[1])

print(rank)  # [['Sam', '2'],['Jamie', '1']]
print(quo)   # ["I'll win",'Be the best']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM