【问题标题】:How to print a line from a text file without a certain character如何从没有特定字符的文本文件中打印一行
【发布时间】:2015-05-18 12:34:20
【问题描述】:

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

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

    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]

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

任何有关编码的帮助和解释,将不胜感激。谢谢各位。

【问题讨论】:

  • 正确答案是否总是标有*?如果是,那么答案是否可能包含*
  • Python 中的字符串有一个内置的replace() 方法。以这种方式使用:'B) = *2'.replace('*', '') 应该可以解决您的问题。
  • 感谢 n9code,但不,任何答案都不会包含字符 *。
  • 根据复杂程度,查看str.replacere.sub
  • 再次,只需使用字典将问题映射到答案。您可以避免并发症。

标签: python python-2.7 printing


【解决方案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)

【讨论】:

  • 如果有替换的星号,则无需测试行。
  • 感谢您的评论,但我是这段代码一次打印所有行,而不是一次打印几行。有没有办法解决这个问题?
  • @Ash:一次几行行?有多少,中间会发生什么?
  • 例如,我使用的代码打印这样的行 print lines[7] print lines[8] print lines[9] print lines[10] print lines[11] print lines[12 ],然后将等待进一步的用户输入,然后再打印下一批。
  • 当我运行你的代码时,它会立即打印出文本文件中的所有行。他们是解决这个问题的方法,还是我不理解?
【解决方案2】:

* 可能出现在:

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

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

也许进一步的假设是,当* 用于标记正确答案时,它将始终出现在同一位置,即等号后的一个空格,因此这可能是一个更好的解决方案:

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

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

如果空格是可变的,例如制表符与空格或不同数量的空格混合,你可以转向这样的正则表达式:

import re

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

【讨论】:

  • 这是一个很好的收获,我忘了带星号的问题。 +1
  • 作者表示在答案正文中找不到* :)
  • @n9code:你说得对,谢谢,OP 确实在我刚刚读过的评论中声明了这一点:)。但这不会改变这个答案的可行性,如果* 在未来某个时间出现在答案中,它也不会中断。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    >>> 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
    

    【讨论】:

      【解决方案5】:

      您可以像其他用户一样在 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
      

      【讨论】:

      • 谢谢,但由于这会打印文本文件中的所有行,您如何只打印某些行,而不是全部?
      • 没错,打印行中除了 * sybmol 之外的所有内容
      • 这样做只会打印除 * 字符之外的所有内容
      • 试一试看看
      • 谢谢,但代码仍然会一次打印我的文本文件的所有行,而不是一次打印某些行。它可能仍然是我目前对 python 的非常基本的理解。还是谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多