f = open("Trades.txt","r")
writer = open("trading.txt","w")
options = input("A:Check trades for 1 or more players/B:Check trades between 2 players: ").lower()
if options == 'b':
player1 = input("Enter the name of player 1: ")
player2 = input("Enter the name of player 2: ")
for lines in f:
if player1 and player2 in lines:
writer.write(lines)
文本文件如下所示:
=======================
[time] player trading with playerx
(To: player, From: playerx)
item
=======================
[Jan 13, 2016 11:53:49 PM Central European Time] y trading with x
(To: x, From: y)
item
=======================
将要求用户输入2个名称以在文本文件中找到。
这两个名字必须在我已经完成的文本中找到。
然后,带有名称的行之后的行必须写入文件UNTIL到达“=======================”。 / p>
所以书面数据看起来像是:
[time] player trading with playerx
(To: player, From: playerx)
item
提前致谢
P.S名称后面的行数会有所不同,所以在比赛后不能写成一定数量的行
答案 0 :(得分:0)
要解决的两件事
第一
if player1 and player2 in lines:
错了,可能这样更好
if player1 in lines and player2 in lines:
在for循环中找到=======================时停止
lines = lines.strip()
if lines == '=======================':
break
“strip()”函数从输入文件中删除换行符,以便该行上的完全匹配正常工作
只是为了清楚代码
for lines in f:
if player1 and player2 in lines:
writer.write(lines)
替换为
for lines in f:
if player1 in lines and player2 in lines:
lines = lines.strip()
if lines == '=======================':
break
writer.write(lines)
答案 1 :(得分:0)
由于源文件对象是一个迭代器,因此您可以在任何地方使用它,而不仅仅是for line in f
语句。
要使用iterable直到出现条件,您可以使用itertools.takewhile
函数。
只要谓词为真,就创建一个从迭代中返回元素的迭代器。
takewhile
将创建新的可迭代,但作为副作用源将被消耗。在文件对象的情况下 - 它会读取行并移动内部文件指针。耗尽takewhile
迭代器后,内部文件指针将指向===
之后的第一行。
代码类似于:
import itertools
player1 = "x"
player2 = "y"
with open("Trades.txt") as src, open("trading.txt", "w") as dst:
for src_line in src:
if player1 in src_line and player2 in src_line:
dst.write(src_line)
for line in itertools.takewhile(lambda s: not s.startswith("======================="), src):
dst.write(line)