将文件中的所有行写入文件UNTIL到达特定字符串

时间:2016-01-23 18:46:16

标签: python-3.x

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名称后面的行数会有所不同,所以在比赛后不能写成一定数量的行

2 个答案:

答案 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)