• ベストアンサー

Pythonでテキストを行数指定して読み込む

Pythonの勉強を始めて4ヶ月ほどの者です。 今、コマンドライン(Winでのコマンドプロンプト、Linux系での端末など)からPythonでメールアドレスが書いてあるテキストを読み込み、そのアドレスにメールを送るプログラムを考えてます。 具体的には、address.txtというファイルに、 aaa.example@test.ne.jp bbb.example@test.ne.jp ccc.example@test.ne.jp という風に記述してあるとします。(一行に一アドレスです。) プログラムの部分(最初からではなく途中です)は、 print "Select the E-mail Address below" a = open("Address.txt") for i in a: print i to = raw_input(":") とまできたんですが、自分としては読み込んだ「Address.txt」に書かれてるアドレスを行数ごとに指定して読み込みたいんです。つまりraw_input(":")に 1を入れたら1行目を指定→「aaa.example@test.ne.jp」 2を入れたら2行目を指定→「bbb.example@test.ne.jp」 3を入れたら3行目を指定→「ccc.example@test.ne.jp」 が選択されるようにし、変数toに代入されるようにしてSMTPモジュールのto_addrに引き渡すようにしたいのです。 ですが行数を指定してテキストを読み込むメゾットやオブジェクトが入ってるモジュールや関数はありますか? Pythonは2.6.4と3.0.1の両方のバージョンが入ってます。できれば両方で動かしたいので3.0.1で仕様の変更があったら教えてもらえるとありがたいです。 OSはメインがWinXPSP3、サブ(テスト用、VMWare使用)にUbuntu9.04(Pythonは2.6系だったと思います。)

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

以下、字下げを表現するのに全角空白を使っています。コピーしたら置き換えましょう。 a = open("Address.txt") lines = [] for line in a:  print line  lines.append(line) to = raw_input(":") addr = lines[to+1] これでaddrに指定行のアドレスが入るはずです。

Teru556
質問者

お礼

ありがとうございます!試してみたいと思います!

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

raw_inputは文字列を返すので、行数の指定や、配列の添字に使うにはint関数で整数型に変換する必要があります。 #その前に、正しい入力かどうかを確認するとよいでしょう #例) if not re.match(r"\s*\d+",to) : #数値じゃなかったらエラー ito=int(to) 全部の行を読み込むなら file.readlinesが便利かも。 a = open("Address.txt") lines=a.readlines() a.close() #開いたら閉じましょう addr=lines[ito-1] #1行目の添字は0,ito行目はito-1 あるいは # 2.6以降なら、with文が便利 with open("Address.txt") as a:  lines=a.readlines() addr=lines[ito-1] 必要な行だけ読みたいなら、それまでの行を空読みします with open("Address.txt") as a:  for i in xrange(ito-1): a.readlines()  addr=a.readline()

Teru556
質問者

お礼

ありがとうございます! #1,2番の方の方法とともに試してみたいと思います!

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

ストリームからはreadlineで1行読み込めるので、ループで指定された行数読み込んで最後の行を利用する。 ストリームの性質を考えると、行数を指定して読み込めるメソッドがあっても上記のような実装になっていると思う。 あと質問のコードだとアドレス一覧を表示するために一度全部読み込んでいるようだけど、そのようにするなら読込み時に行ごとに配列に入れておけば指定行へのアクセスは簡単だね。

Teru556
質問者

お礼

すばやい返事ありがとうございます! 正直まだわからないところがあるのですが、 >あと質問のコードだとアドレス一覧を表示するために一度全部読み込んでいるようだけど、そのようにするなら読込み時に行ごとに配列に入れておけば指定行へのアクセスは簡単だね。 というのがまだわからずにいます。読み込む行ごとに配列を入れるのはどうすればいいのですか?質問に質問を重ねてすいません… 自分でも調べてみます。

関連するQ&A