プロが教えるわが家の防犯対策術!

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系だったと思います。)

A 回答 (3件)

以下、字下げを表現するのに全角空白を使っています。

コピーしたら置き換えましょう。
a = open("Address.txt")
lines = []
for line in a:
 print line
 lines.append(line)
to = raw_input(":")
addr = lines[to+1]
これでaddrに指定行のアドレスが入るはずです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/06 19:47

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()
    • good
    • 1
この回答へのお礼

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

お礼日時:2010/04/06 19:31

ストリームからはreadlineで1行読み込めるので、ループで指定された行数読み込んで最後の行を利用する。


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

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

というのがまだわからずにいます。読み込む行ごとに配列を入れるのはどうすればいいのですか?質問に質問を重ねてすいません…
自分でも調べてみます。

お礼日時:2010/04/05 13:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!