从Python中的文本文件中读取文本格式化问题?

时间:2014-03-28 20:55:14

标签: python

因此,我的一项任务是修改现有的琐事游戏,以便每个问题都有一定的分值。游戏几乎可以从文本文件中获取所有文本。

但是,我遇到了一些问题:出于某种原因,当我向文本文件添加一个点值时,它会混淆程序的格式并且不会打印某些行。

当我运行它时,我得到了这个:

    Welcome to Trivia Challenge!

    An Episode You Can't Refuse

  On the Run With a Mamma

  You'll end up on the goat

  1 - 

  2 - If you wait too long, what will happen?

  3 - You'll end up on the sheep

  4 - 

What's your answer?: 

我不确定如何修复它。有什么帮助吗?

这是程序文件和文本文件。

# Trivia Challenge
# Trivia game that reads a plain text file

import sys

def open_file(file_name, mode):
    """Open a file."""
    try:
        the_file = open(file_name, mode)
    except(IOError), e:
        print "Unable to open the file", file_name, "Ending program.\n", e
        raw_input("\n\nPress the enter key to exit.")
    sys.exit()
    else:
        return the_file

def next_line(the_file):
    """Return next line from the trivia file, formatted."""
    line = the_file.readline()
    line = line.replace("/", "\n")
    return line

def next_block(the_file):
    """Return the next block of data from the trivia file."""
       category = next_line(the_file)

       question = next_line(the_file)

       answers = []
       for i in range(4):
           answers.append(next_line(the_file))

       correct = next_line(the_file)
       if correct:
           correct = correct[0]

       explanation = next_line(the_file)

       point_val = next_line(the_file)

       return category, question, answers, correct, explanation, point_val

def welcome(title):
    """Welcome the player and get his/her name."""
    print "\t\tWelcome to Trivia Challenge!\n"
    print "\t\t", title, "\n"

def main():
    trivia_file = open_file("trivia2.txt", "r")
    title = next_line(trivia_file)
    welcome(title)
    score = 0


  # get first block
    category, question, answers, correct, explanation, point_val = next_block(trivia_file)

    while category:
        # ask a question
        print category
        print question
        for i in range(4):
            print "\t", i + 1, "-", answers[i]

        # get answer
        answer = raw_input("What's your answer?: ")

        # check answer
        if answer == correct:
            print "\nRight!",
            score += int(point_val)
        else:
            print "\nWrong.",
        print explanation
        print "Score:", score, "\n\n"

        # get next block
        category, question, answers, correct, explanation, point_val = next_block(trivia_file)

    trivia_file.close()

    print "That was the last question!"
    print "You're final score is:", score

main()  
raw_input("\n\nPress the enter key to exit.")

文字档案(trivia2.txt)

  

你无法拒绝的一集

     

使用Mamma运行

     

如果你等了太久,会发生什么?

     

你最终将成为羊群

     

你最终将成为母牛

     

你最终会成为山羊

     

你最终会选择emu

     

羔羊只是一只小绵羊。

     

5

     

教父现在会和你相处

     

假设你有一个灵魂教父的观众。怎么样/聪明

     

对他说话?

     

先生。理查德

     

先生。多米诺

     

先生。布朗

     

先生。检查

     

10

     詹姆斯布朗是灵魂的教父。

     

那会花费成本

     

如果您以卢比支付Mob保护金,那么您最喜欢什么业务

     

可能会投保吗?

     

荷兰的郁金香农场

     

您在印度的咖喱粉工厂

     

俄罗斯伏特加酿酒厂

     

你在瑞士的军刀仓库

     

卢比是印度的标准货币单位。

     

15

     

保持家庭

     

如果你母亲的父亲的姐姐的儿子在“家庭”中,你怎么和暴徒有关?

     

你的第一个表弟一旦被删除

     

由你的第一个表弟两次删除

     

你的第二个表弟曾被删除

     

由你的第二个表弟两次删除

     

你母亲的父亲的妹妹是她的姨妈 - 而她的儿子是你母亲的第一个堂兄。因为你和你的母亲正好相隔一代,所以她的第一个堂兄是你的第一个堂兄,一旦被移除。

     

20

     

女佣人

     

如果您真的要洗钱,但又不想让账单上的绿色显示,那么您应该使用什么温度?

     

     

     

微温

     

     

根据我的洗涤剂瓶,冷却最适合颜色   运行

     

25

1 个答案:

答案 0 :(得分:0)

我不完全确定您遇到了什么问题,因此我将为您提供一些关于您的代码的一般性评论,希望更好的方法可以让您获得更好的结果

一般情况下,在进行I / O操作时,请尽可能靠近地打开和关闭文件,这样您就不会忘记关闭它,因此整个程序更容易调试。如果您可以将with语句用作上下文管理器,Python会让您变得非常轻松。

with open('filename.txt', 'r') as filename:
    some_var = filename.read()

在此块之后,文件名会自动关闭,some_var仍然将其全部内容作为字符串。

其次,虽然我认为非常酷,但您正在以这种方式使用函数来抽象代码(这是一种有价值的方法!),我认为你应该抽象一些对你的问题集更具体的东西。例如,

def open_file(file_name, mode):
    """Open a file."""
    try:
        the_file = open(file_name, mode)
    except(IOError), e:
        print "Unable to open the file", file_name, "Ending program.\n", e
        raw_input("\n\nPress the enter key to exit.")
        sys.exit()
    else:
        return the_file

你的这个函数将文件名作为参数和模式参数,并尝试打开一个文件,并处理IOError以防它无法打开。听起来很像内置的open,不是吗?所以就这样使用!如果您需要处理IOError,则可以在正常try / except块中执行此操作,但有时可以让它冒泡。毕竟,你的程序并非真正处理例外,它只是报告它然后退出,这正是你没有抓住它时会发生的事情。 (此外,重新提出异常或至少将错误消息打印到sys.stderr更合适,但那是另一个故事。)

我想传达给你的最后一件事是关于数据结构。当我看到你的数据块时,这就是我所看到的:

{
    'category': line1,
    'question': line2,
    'answers': [line3, line4, line5, line6],
    'correct_answer': line7,
    'points': int(line7.strip()),
}

每个块都是dict为一个问题分组一组数据。如果您将其存储为q,则可以拨打q['category']q[answers][0]等。这会以比元组更自然的方式将事物组合在一起(这也需要您重复行category, question, answers, correct, explanation, point_val = next_block(trivia_file))。请注意,我还将答案分组为list - 它是一个答案列表!你可以把每个这样的dict放在一个列表(一个dicts列表)中,然后你就可以得到一整套琐事问题。您甚至可以在整个列表中使用random.shuffle随机化订单!

尝试重新组织文件,以便一次执行一项操作。阅读文件,从中获取您想要的内容,然后完成它。不要在整个脚本上展开读取操作。解析问题,将它们存储在有用的地方(提示:你有没有想过让它成为一个类?),然后用它完成。然后循环已经结构化的问题并提出要求。这将使您的程序更容易调试,让您的生活更轻松。甚至可以帮助你现在拥有的东西。 :)


快速示例

"""Trivia challenge example"""

from __future__ import print_function, with_statement

import sys


questions = []
with open('trivia_file.txt', 'r') as trivia_file:
    title = trivia_file.readline()
    line = trivia_file.readline()
    while line:
        q = {}
        q['category'] = line
        q['question'] = trivia_file.readline()
        if q['question'].endswith('/'):
            q['question'] = q['question'][:-1] + trivia_file.readline()
        q['answers'] = [trivia_file.readline() for i in range(4)]
        q['correct'] = trivia_file.readline()
        q['explanation'] = trivia_file.readline()
        q['points'] = int(trivia_file.readline())
        questions.append(q)
        line = trivia_file.readline()

我其实在想你可能会用这样的东西读它。在Python中迭代文件肯定有更好的方法,但对于你来说,每一行都没有意义,每几行都是,所以这可以说是更清晰。 (此外,你必须处理那种糟糕的行继续语法;如果不是那样,那就更好了,但我认为你没有建立文件格式。)

只需读入文件,解析其内容,然后继续。现在它在记忆中并将在后台关闭。你准备玩琐事。我之前描述的所有序列现在都被分组在一个很好的长列表中,所以你可以随机化它们:

import random
# if the questions are supposed to stay in order skip this step
random.shuffle(questions)

然后通过迭代来玩游戏:

for question in questions:
    print('Next category: ', question['category'])
    print('Q: ', question['question'])
    print('The possible answers are:')
    for i in range(4):
        print('{}. {}'.format(i+1, question['answers'][i]))
    # etc...

这会问每个问题一次。一旦你到达列表的末尾,你就没有问题了,所以现在是游戏结束的时候了!