2011-01-24 29 views
2

私はここで答えを探しているのではなく、むしろ私がこの作業にどのように接近しているべきかのガイドラインです。テキストファイルからの読み込み

... 
    1947q2  -0.6 
    1947q3  -0.3 
    1947q4   6.2 
    1948q1   6.5 
    1948q2   7.6 
    1948q3   2.2 
    1948q4   0.6 
... 

私の目標は、キーワードの選択に基づいてテキストファイルを読み取ることができるようにすることです:

は、私は次の情報が含まれてtxtファイルを持っています。たとえば、私は唯一の1947を含む行を読みたいので、出力は次のように次のようになります。数字は毎年に関連付けられているので

1947q2  -0.6 
    1947q3  -0.3 
    1947q4   6.2 

、私はすべてのタプルを組み合わせ、その後タプル内の各行を置くことを考えていましたリストに入れるこのリストから、正規表現を使用してリストを検索して一致するタプルを取得し、それに応じて出力します。

これは受け入れられる方法ですか?これにはもっと簡単な解決策がありますか?最適な方法を探しているのではなく、この問題にどう対処するかについてはさまざまな考え方があります。

答えて

5
import sys 
with open('file.txt') as f: 
    for line in f: 
    if '1947' in line: # or some complex regular expressions test 
     sys.stdout.write(line) 

あなただけforループの本体にそれぞれの行を解析し、それを受け入れるかどうかを決めることができます。あなたが空想を得たい場合は、mapfilterを見てください。 withステートメントは、ファイルがその後閉じられることを保証します。

+0

OPは彼が尋ねたことをやりたがっていると仮定すると、これは高速かつ効率的です。すべてをメモリにロードするのは無駄です。 – easel

+0

うわー、私はこのようなテキストファイルを検索することはできませんでした。 – super9

+0

nitpick: 'xreadlines()'はこれよりも使い勝手が良いです。 – nmichaels

0

キーワードはいつも年になりますか?もしそうなら、私はこのような辞書にそれらを格納します:

mydata[year][quarter] = value 

をだから、MYDATA [「1947」]を経由してあなたの例のデータを得ることができます。

ファイルを読み取るには、csv.readerを使用し、最初の列を 'q'に分割して年と四半期を個別に取得します。あなたが行うことができます

+0

はい、いつも年になる – super9

1

ことの一つは、あなたがすでに行っているものに類似した方法を使用して動的にリストのメンバーをフィルタリングするuse generatorsにある:

data = open("file.txt") 
fortysevens = (line for line in data if contains_47(line)) 
for line in fortysevens: 
    # do something here 

def contains_47(line): 
    # your existing code here to detect if a line contains 47 
0

私は、内のすべての行を取ったコードを記述します。関数は(1947,3、-7.0)のような一連のタプルを返しました。それから、私が本当に欲しいものを見つけ出すための結果に対する単純な反復。

0

入力ファイルの行のデータが固定されている場合 - 彼らはのように見えるとして - そして、これがうまくいくような単純なもの:

with open('data.txt') as data: 
    for line in data: 
     if line[4:8] == '1947': 
      print line, 

# output: 
#  1947q2  -0.6 
#  1947q3  -0.3 
#  1947q4   6.2 

私はprint line,を使用した理由があるためであることに注意してください各行は改行で終わります。

0

私が知る限り、正規表現はこの種の仕事のために発明されています。

正規表現は、直接「キーワードを含む行を」検索します。正規表現の検索は、 "line in f"ループの不器用な使用よりも凝縮されたコードで表現されるより複雑な条件に基づくこともできます。

私のモットーは、「テキストはありません」というテキストです。それはただの文字列です。

"for line in f"ループとは、データの流れを解析して改行を検出し、改行を止めることです。これが最初の検出です。次に、見つかった各行で、検出された各行で1つ(またはそれ以上)の単純(または複合)条件をテストする必要があります。これが第2の研究です。

一方、正規表現は、改行を予備検索することなく、検索されたものを直接見つけます。行の条件とキーワードの条件は同時にテストされます。 'R' モードでPythonが 'の\ n' 内のすべての改行を変換することを

import re 

keyw = '1947' 
pat = re.compile('.*?' + keyw + '.*') 

with open('thefile.txt','r') as f: 
    keyworded_lines = pat.findall(f.read()) 

# do what you need with keyworded_lines 

注意。 REの点は '\ n'と一致しないので、REはkeywの後に '。*'だけを必要とします。

関連する問題