2017-12-01 17 views
1

テキストファイルには多くの行が書き込まれていますが、テキストファイルには「@Testrun」という単語が何度もあります。これらの2つの "@Testrun"の間の行を1つの部分として考えると、これらのテキストの3〜4部以上が "@Testrun"として扱われます。私の質問は、私は部品でこれらの行を抽出し、それらの部分で重複行を見つけるのですかです:私は、次のコードを試してみたが、これは動作していないテキストファイルの行を抽出して重複を見つける方法

@TestRun 
    And user validate message on screen "Switch to paperless" 
    And user click on "Manage accounts" label 
    And user click link with label "View all online services" 
    And user waits for 10 seconds 
    Then page is successfully launched 
    And user click link with label "Go paperless for complete convenience" 
    Then page is successfully launched 
    And user validate message on screen "#EmailAddress" 
    And user clicks on the button "Confirm" 
    Then page is successfully launched 
    And user validate message on screen "#MessageValidate" 
    Then page is successfully launched 
    And user click on "menu open user preferences" label 
    And user clicks on the link "Statement and letter preferences" 
    Then page is successfully launched 
    And user validate "Switch to paperless" button is disabled 
    And user validate message on screen "Online only" 
    When user click on "Log out" label 
    Then page is successfully launched 

@TestRun 
    And user click on link "Mobile site" 
    And user set text "#Surname" on textbox name "surname" 
    Then page is successfully launched 
    And user click on link "#Account" 
    Then page is successfully launched 
    And user verify message on screen "#Account" 
    And user verify message on screen "Manage statements" 
    And user verify message on screen "Step 1 of 3" 
    Then page is successfully launched 
    And user verify message on screen "Current format type" 
    And user verify message on screen "Online" 
    When user selects the radio button "Paper" 


@TestRun 
Then user wait for page load 
And user click on button "Continue to Online Banking" 
Then user wait for page load 
    And user click on "menu open user preferences" label 
    And user clicks on the link "Statement and letter preferences" 
    Then page is successfully launched 
    And page is successfully launched 
    And user waits for 10 seconds 
@TestRun 
    Then page is successfully launched 
    And user waits for 10 seconds 
    And user click checkbox "Telephone" 
    And user click checkbox "Post" 
    And user clicks on the button "Save" 
    Then page is successfully launched 

私のテキストファイルは次のようになります

with open('CustPref.txt') as input_data: 
    for line in input_data: 
     if line.strip() == '@TestRun ': 
      break 
    for line in input_data: 
     if line.strip() == '@TestRun ': 
      break 
     print line 

出力されますが、完全に間違っています。 私はあなたが2つの問題に取り組むこの

+0

line.strip()は空白を削除します。なぜなら、後で行末に空白文字列を置くのはなぜでしょうか? –

+0

Regexを使ってみてください。 – Jump3r

+0

@ Jump3rここではそれほど適切ではありません。正規表現はどのくらい正確に役立つでしょうか?それはちょうど不必要な合併症です。 – tripleee

答えて

0

more_itertoolsサードパーティライブラリを使用して、目的のターゲットの前にテキストを分割できます。

更新itertools.dropwhileを使用して最初のターゲットの前に行を削除できます。

import itertools as it 
import more_itertools as mit 


with open("CustPref.txt", "r") as f: 
    lines = f.readlines() 

    pred = lambda x: x.startswith("@TestRun")  # trailing-space protection 
    inv_pred = lambda x: not pred(x) 

    lines = it.dropwhile(inv_pred, lines)   # optional 
    chunks = list(mit.split_before(lines, pred)) 

print(chunks) 

出力(省略)

[['@TestRun\n', 
    ' And user validate message on screen "Switch to paperless" \n', 
    ...], 
['@TestRun \n', 
    ' And user click on link "Mobile site" \n', 
    ...], 
['@TestRun\n', 
    'Then user wait for page load\n', 
    ...], 
...] 
+0

第1テストの前にテキストがあれば、それを1つのセプレートリストと見なします。リストにある?私はこのアプローチを試してみましたが、それは私に完璧なエスチュールを与えましたが、第1テストランの前にテキストがあると、それを別のリストとして考えています。 –

+0

リストを作成したら、手動でスライスすることもできます。 'chunks [1:]'は最初のエントリを除くすべてを選択します。最初のターゲットの前に行を自動的にドロップしたい場合は、 'itertools.dropwhile'(updateを参照)を使用してください。 – pylang

+0

すべてのリストで、すべての要素にいくつかのインデックス番号を付ける場合、リスト内に重複する要素がある場合は、同じインデックス番号を持つ必要があります。私はこのdef list_duplicates(seq)を使って試しました: 見た= set() seen_add = seen.add 返す[idxのためのidx、列挙されたアイテム(seq)アイテムが見えているかseen_add(アイテム)] list_duplicates )しかしこれは役に立ちません –

0

を解決するのですexpected.How私はない出力としてのみ1行を得る:重複 を取り除くcorrekt部品

    • 分割、それを
      分割

      第一オプション

      解析行毎にファイル:

      parts = [] # all lines between 2 @TestRun's 
      chunks = [] # all chunks of lines between 2 @TestRun's 
      
      startNow = False # wait till first @TestRun before keeping anything 
      
      for line in Text(): # see definition for Text() below - it mimics your open('...') 
          if line.strip() == '@TestRun': 
           startNow = True 
           if len(parts) > 0: # found a Testrun, if parts contains lines append to chunks 
            chunks.append(parts) 
            parts = [] 
          elif startNow == True: # check if first TestRun hit, if so append line to parts 
           parts.append(line) 
      
      
      print(chunks) # done -> list of list of lines between chunks. 
      

      第二オプション

      完全なテキストや使用リストとしてで読み込ん、線でテキストを分割しないでください。それを分割するための理解:

      biggerChunks = [x.strip() for x in TextTT().split("@TestRun") ] 
      chunkified = [x.splitlines() for x in biggerChunks if len(x.strip()) > 0 ] 
      

      あなたは012に最初に分割したと大きなテキストチャンクのリストを取得し、それぞれを行単位で分割します。 - それはそうではないSOのリンクですhow-do-you-remove-duplicates-from-a-list-in-whilst-preserving-orderを:結果はほぼ同じである:(順序を維持しながら)

      が、ここで答えた重複を削除[[TestRunさん@ 2の間のすべての行が]]


      :)


      ヘルパー テキスト()、再びここでそれを逆流しようとすると、開いているファイルのために置き換え、TestTT()は、全体のチャンクですテキスト:

      def Text(): # instead of file open, returns list of lines 
          return TextTT().splitlines() 
      
      def TextTT(): # unsplit text 
          return ''' 
      @TestRun 
          And user validate message on screen "Switch to paperless" 
          And user click on "Manage accounts" label 
          And user click link with label "View all online services" 
          And user waits for 10 seconds 
          Then page is successfully launched 
          And user click link with label "Go paperless for complete convenience" 
          Then page is successfully launched 
          And user validate message on screen "#EmailAddress" 
          And user clicks on the button "Confirm" 
          Then page is successfully launched 
          And user validate message on screen "#MessageValidate" 
          Then page is successfully launched 
          And user click on "menu open user preferences" label 
          And user clicks on the link "Statement and letter preferences" 
          Then page is successfully launched 
          And user validate "Switch to paperless" button is disabled 
          And user validate message on screen "Online only" 
          When user click on "Log out" label 
          Then page is successfully launched 
      
      @TestRun 
          And user click on link "Mobile site" 
          And user set text "#Surname" on textbox name "surname" 
          Then page is successfully launched 
          And user click on link "#Account" 
          Then page is successfully launched 
          And user verify message on screen "#Account" 
          And user verify message on screen "Manage statements" 
          And user verify message on screen "Step 1 of 3" 
          Then page is successfully launched 
          And user verify message on screen "Current format type" 
          And user verify message on screen "Online" 
          When user selects the radio button "Paper" 
      
      
      @TestRun 
      Then user wait for page load 
      And user click on button "Continue to Online Banking" 
      Then user wait for page load 
          And user click on "menu open user preferences" label 
          And user clicks on the link "Statement and letter preferences" 
          Then page is successfully launched 
          And page is successfully launched 
          And user waits for 10 seconds 
      @TestRun 
          Then page is successfully launched 
          And user waits for 10 seconds 
          And user click checkbox "Telephone" 
          And user click checkbox "Post" 
          And user clicks on the button "Save" 
          Then page is successfully launched 
      ''' 
      

      説明のコメントを参照してください - f.e. itertools.chainを使用して必要に応じて内部線を再結合する

  • 0

    単純なアプローチは、あなたがすでに見てきたラインを覚えているだろう。それらをリストにまとめることはできますが、辞書やセットを使用する方が効率的です。

    一度に1行ずつ読みます。この行(新しいTestRunヘッダーではありません)が以前に見られた場合は、それを印刷しないでください。 TestRunヘッダーの場合は、見たことを忘れてしまいます。ループの中でこれを得るすべてを印刷します。次の行からやり直してください。プログラム

    with open('CustPref.txt') as input_data: 
        seen = set() 
        for line in input_data: 
         # trim trailing newline 
         line = line.rstrip('\n') 
         if line == '@TestRun ': # really sure about the trailing space? 
          seen = set()   # who am I? what day is it? 
         elif line in seen: 
          # skip the rest of the for loop and start over 
          continue 
         else: 
          seen.add(line) 
         print(line) 
    

    、それは「それは@TestRunであれば見に追加する他、すでに見そうでない場合は、」あなたはそれが二回@TestRunだかどうかをチェックする必要はありませんので、この順番にチェックすることは理にかなって。私は、より簡単なものにするために、上記の展覧会でより自然な順序を保ちたいと思っていました。

    関連する問題