2017-06-12 4 views
0

私はプログラムが文字列number1を見つけた場合、たとえば、印刷しようとしていますファイルを1行ずつ読み込み、特定の文字列を持つ行だけをpythonで表示しますか?

wbwubddwo 7::a number1 234 ** 
/// 45daa;: number2 12 

time 3:44 

、それは234

を印刷しますこれらの行を含むテキストファイルを持っている私は、以下の簡単なスクリプトで始まるが、それは印刷しませんでした私が望むもの

with open("test.txt", "rb") as f: 
    lines = f.read() 
    word = ["number1", "number2", "time"] 
    if any(item in lines for item in word): 
     val1 = lines.split("number1 ", 1)[1] 
     print val1 

これは、次のような結果

234 ** 
/// 45daa;: number2 12 

time 3:44 

を返すそれから私はf.readlines()f.read()を変更しようとしたが、今回はそれが何をプリントアウトしませんでした。

誰もがこれを行うための他の方法を知っていますか?最終的には、各行の値を234,123:44とし、データベースに格納したいと考えています。

ありがとうございました。ほんとうにありがとう。下記の

答えて

1

説明:

with open("test.txt", "r") as f: 
    lines = f.readlines() 
    stripped_lines = [line.strip() for line in lines] 

words = ["number1", "number2", "time"] 
for a_line in stripped_lines: 
    for word in words: 
     if word in a_line: 
      number = a_line.split()[1] 
      print(number) 

1)すべての「RB」の最初のバイトがb'number1 234'のようなすなわち何かが文字列オブジェクトを取得するための使用は「r」に返されるオブジェクトを提供します。

2)あなたが読んだ行は、このようなものになり、リストに格納されます。

['number1 234\r\n', 'number2 12\r\n', '\r\n', 'time 3:44']

お知らせ\r\nものは、あなたが改行を持っていることを指定します。使用を取り除くにはstrip()

3)stripped_linesから各lineを取り、各word wordsからを取ると、その単語がinを使用して、その行に存在しているかどうかを確認します。

4)a_linenumber1 234となりますが、数字の部分だけが必要です。だからのsplit() 出力は

['number1','234']split()[1]だろうインデックス1(第2要素)の要素を意味します。

5)文字列がyour_string.isdigit()

UPDATE使って数字である場合にも確認できます。あなたの質問と入力ファイルを更新しているので、これは動作します:

import time 

def isTimeFormat(input): 
    try: 
     time.strptime(input, '%H:%M') 
     return True 
    except ValueError: 
     return False 

with open("test.txt", "r") as f: 
    lines = f.readlines() 
    stripped_lines = [line.strip() for line in lines] 

words = ["number1", "number2", "time"] 
for a_line in stripped_lines: 
    for word in words: 
     if word in a_line: 
      number = a_line.split()[-1] if (a_line.split()[-1].isdigit() or isTimeFormat(a_line.split()[-1])) else a_line.split()[-2] 
      print(number) 

なぜこれをisTimeFormat()機能?

def isTimeFormat(input): 
     try: 
      time.strptime(input, '%H:%M') 
      return True 
     except ValueError: 

3:44または4:55が時間形式であるかどうかをチェックします。あなたも値として考えているからです。 最終出力:

234 
12 
3:44 
+0

あなたの答えに感謝します。私はあなたの提案に基づいて私自身の答えを書いた。 'isTimeFormat'については、値を文字列として取得し、データベースに保存することを好みます。 – Fang

-1

あなたはこれを考えすぎています。最初の行の最後に2つのアスタリスクがなく、特定の値を含む行を出力したい場合は、ファイルを1行ずつ読み込み、選択した値のいずれかが一致しているかどうかをチェックし、

search_values = ["number1", "number2", "time"] # values to search for 

with open("test.txt", "r") as f: # open your file 
    for line in f: # read it it line by line 
     if any(value in line for value in search_values): # check for search_values in line 
      print(line[line.rfind(" ") + 1:].rstrip()) # print the last value after space 

あなたを与えるだろう:

234 
12 
3:44 

の場合 - (スペースとラインの端との間の値)最後の値プリントアウト解析する必要はありませんが/すべてで行全体を分割アスタリスクを使用すると、ファイル形式をより正確に定義する必要があります。分割すると、必ずしも必要な値が得られるわけではありません。

+0

アスタリスクは単なる例です。それは他の複数の文字/数字/記号であってもよいし、 '/// 45daa ;; number2 12'のような他の文字/数字/記号であってもよい。私は 'number1'の値を' 234'にしたいだけです。あなたは分裂が私に結果をもたらさないと言っているので、価値を得るための他のアイデアはありますか? – Fang

+0

@Fang - 'number1のための値'の意味は何ですか?それに直接続くデータは両側のスペースで区切られていますか? – zwer

+0

はい。私の質問があなたにはっきりしない場合、私は残念です。 'number1:234'ではなく' number1 234'であれば簡単かもしれませんが、それが好きであれば '234'を得るためにはどうすればいいですか? – Fang

0

いくつかの試行錯誤の末、私は以下のような解決策を見つけました。これは@s_vishnu

with open("test.txt", "r") as f: 
    lines = f.readlines() 
    stripped_lines = [line.strip() for line in lines] 

    for item in stripped_lines: 
     if "number1" in item: 
      getval = item.split("actual ")[1].split(" ")[0] 
      print getval 

     if "number2" in item: 
      getval2 = item.split("number2 ")[1].split(" ")[0] 
      print getval2 

     if "time" in item: 
      getval3 = item.split("number3 ")[1].split(" ")[0] 
      print getval3 

出力

234 
12 
3:44 

この方法により提供される解答に基づいており、私は、データベースに各データを保存する例えば他のものをも行うことができます。

私の答えをさらに改善するための提案はありません。

関連する問題