如何从没有特定字符的文本文件中打印一行

How to print a line from a text file without a certain character

不太确定这个问题是否重复,但在搜索了一段时间后似乎不是。

假设我在文本文件中有这些文本行。

    Q5) What is 1+1
    A) = 1
    B) = *2
    C) = 0
    D) = -342
    E) = 121

正确答案 B) = *2 在线上标有 * 标记。你将如何打印这一行,但没有字符,所以该行将像这样打印:

    Q5) What is 1+1
    A) = 1
    B) = 2
    C) = 0
    D) = -342
    E) = 121

我对Python还是个新手,但我明白:

print lines[3]

将打印特定行。但是我想知道如何在没有特定字符的情况下打印一行。

任何关于编码的帮助和解释,将不胜感激。谢谢大家。

您想打印没有特定字符的行,对吗?只需迭代并替换:

for line in data:
    print line.replace('*', '')

您可以像其他用户那样在 for 循环中读取文件本身。通过使用 strip 函数,您可以删除不需要的试验边缘和前沿

我的代码:

a=open("filename","r")
contents=a.readlines()
i=0
for content in contents:

    print str.strip(content.replace("*",""))
    print i
    i=i+1

编辑: 鉴于此输入:

Q1) What is 1*1?
   A) = 0
   B) = *1
   C) = 2
   D) = -1
Q2) What is 1-1?
   A) = *0
   B) = 1
   C) = 2
   D) = -1
Q3) What is 1/1?
   A) = 0
   B) = *1
   C) = 2
   D) = -1
Q4) What is 1%1?
   A) = *0
   B) = 1
   C) = 2
   D) = -1
Q5) What is 1+1?
   A) = 1
   B) = *2
   C) = 0
   D) = -342
   E) = 121

有很多方法可以解决这个问题。这些是我的第一个想法:

import re

def ask_user(answer):
    user_ans = raw_input("> ").strip()
    if user_ans == answer:
        print "Correct!\n"
        result = True
    else:
        print "Wrong!\n"
        result = False

    return result

question = None

with open('test.txt') as test:
    for line in test:
        if line[0] == 'Q':
            if question:
                ask_user(answer)
            question = line
        else:
            m = re.match(r'(.*?)\*(\d+)', line)
            if m:
                line, answer = m.groups()
                line = "%s%s\n" % (line,answer)

        print line,

# Final question
ask_user(answer)

假设您的答案正文中没有 *,只需执行以下操作:

>>> questions = Question.from_file('your_file.here')
>>> print(questions[0])

Q5) What is 1+1
A) = 1
B) = 2
C) = 0
D) = -342
E) = 121

>>> print(questions[0].correct_answer)

B) = 2

您可以在下面找到定义:

class Question(object):
    def __init__(self, body):
        super(Question, self).__init__()

        self.body = body
        self.answers = []
        self.correct_answer = None

    def add_answer(self, answer, is_correct=False):
        self.answers.append(answer):

        if is_correct:
           self.correct_answer = answer

    def __repr__(self):
        result = self.body + '\n'
        for answer in self.answers:
            result += answer + '\n'

        return result

    @classmethod
    def from_lines(cls, lines):
        question = cls(lines[0])

        for ans_line in lines[1:]:
            body = ans_line
            is_correct = False
            if Answer.CORRECT_MARK in ans_line:
                body = ans_line.replace(Answer.CORRECT_MARK, '')
                is_correct = False
            question.add_answer(Answer(body, question, is_correct))

    @classmethod
    def from_file(cls, filename):
        questions = []
        with open(filename) as q_file:
            lines = q_file.readlines()

            for i in range(0, len(lines), 6):
                questions.append(cls.from_lines(lines[i:i+6]))

class Answer(object):
    CORRECT_MARK = '*'

    def __init__(self, body, question, is_correct=False):
        super(Answer, self).__init__()

        self.body = body
        self.question = question

        question.add_answer(self, is_correct)

    def is_correct(self):
        return self.question.correct_answer == self

    def __repr__(self):
       return self.body

A * 可能出现在:

  • 问题,例如Q5) What is 2*2 似乎有可能,
  • 作为正确答案的标记(如 OP 所示),
  • 答案中的其他地方(合理假设)

在文件的每一行盲目使用 str.replace() 是不切实际的,因为它会影响所有行类型,可能会损坏问题和答案。

也许进一步的假设是,当使用*标记正确答案时,它总是出现在相同的位置,即等号后面的space,所以这可能是更好的解决方案:

line = line.replace(') = *', ') = ', 1)

这将用 ) = 替换 第一次 出现的 ) = *。相同的字符序列不太可能出现在其他地方。

如果白色space是可变的,例如选项卡与 spaces 或不同数量的 spaces 混合,你可以转向这样的正则表达式:

import re

pattern = re.compile(r'([A-Z]\)\s+=\s+)\*(.*)$')
line = pattern.sub(r'', line)