如何从没有特定字符的文本文件中打印一行
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)
不太确定这个问题是否重复,但在搜索了一段时间后似乎不是。
假设我在文本文件中有这些文本行。
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)