【问题标题】:Trying to read data from a file and turn each line into a list, but it skips some values试图从文件中读取数据并将每一行变成一个列表,但它会跳过一些值
【发布时间】:2015-05-27 05:16:37
【问题描述】:

我正在尝试制作一个简单的基于文本的游戏,我需要存储玩家的分数。所以,我制作了这个小脚本,它可以从文件中获取数据,并且(据说)这样做:

  • 遍历每个单词,并将该单词添加到其所在行的列表中;
  • 当程序遇到新行时,将行列表添加到包含所有内容的通用列表中。

这是我的代码:

def readData(path):
    file = open(path, 'r')
    data = []
    curWord = ''
    curLineData = []

    while True:
        char = file.read(1)
        if not char == '\n':
            if not char == ' ':
                curWord = curWord.join(char)
            else:
                curLineData.append(curWord)
                curWord = ''
        else:
            data.append(curLineData)
            curLineData = []
            curWord = ''

        if not char:
            break

    file.close()
    return data

这些是file.txt的内容:

p1 1 4
p2 2 18
p3 3 3

这是我的问题:每当我运行代码时,我都会得到:

[['1', '1'], ['2', '2'], ['3', '3']]

当我期望得到:

[['p1', '1', '4'], ['p2', '2', '18'], ['p3', '3', '3']]

问题是它会跳过第一个单词,添加第二个单词,然后重复第一个单词,找到尽可能多的单词。经过一番测试,我还发现它只会在末尾有空行时添加最后一行。

我很想知道我做错了什么(除了愚蠢),如果你能告诉我如何解决它会很棒:)

【问题讨论】:

  • 如果可以的话,一般来说for line in file:... 更符合pythonic。每次迭代都会给出文件的下一行。
  • 请同时写下所需的输出
  • @ari 好的。我会尝试这样做并分享结果。
  • @user1767754 所需的输出是 [['p1', '1', '4'], ['p2', '2', '18'], ['p3', '3 ','3']]。我会更新问题

标签: python list


【解决方案1】:

str.join 不会将字符串附加到调用方法的末尾;它使用调用者作为“分隔符”将参数的每个元素连接到join。也就是说,您似乎认为"foo".join("bar") 会产生"foobar",而实际上它会产生"bfooafoor"

更好的方法是简单地逐行读取文件,并使用空格作为分隔符将每一行拆分为单词:

def readData(path):
    rv = []
    with open(path, 'r') as file:
        for line in file:
            words = line.split()
            rv.append(words)
    return rv

【讨论】:

  • 谢谢。我无法相信我是如何为这么简单的事情搞得这么一团糟的:D 我绝对应该知道str.split()。另外,感谢您指出 str.join 方法的作用。我不知道。
【解决方案2】:

你可以这样做:

def readData(path):
    with open(path, 'r') as myfile:
        lines = myfile.readlines()
    return [line.strip().split(' ') for line in lines]

您的代码与此代码之间的一些差异:

  • 处理文件时,通常最好使用with 语句 (https://docs.python.org/2/tutorial/inputoutput.html)
  • 最好不要为变量使用名称file,因为它是一个内置类型
  • 您可以使用返回行列表的readlines 方法
  • 您可以使用split 方法将每一行拆分为一个列表
  • 您可以使用列表推导来构建最终列表

【讨论】:

  • 我使用 chepner 的答案而不是这个答案的唯一原因是因为这个答案会在输出中留下 \n。除此之外,谢谢!
  • 就使用内置名称作为变量而言,file 是不太可能导致问题的一种。与 strdict 之类的类型不同,有另一个函数 (open) 更适合用于创建 file 的实例。
  • @pta2002 没问题 :-) ...我编辑了答案以删除输出中的新行(我在拆分之前使用了strip)。
  • @chepner 没错,但我认为这不是一个好习惯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多