Learning to program - The Basics - Handling Files

However we can pass a full path name to the file() or open() functions instead of just the file name. There is a wrinkle when using Windows however, because the \ character used to separate folders in a Windows path has a special meaning inside a Python string so when specifying paths in Python it is best to use the / character instead and that will work on any Operating System including Windows.

Now, consider how you could cope with long files. First of all you would need to read the file one line at a time (in Python by using readline() and a while loop instead of readlines() and a for loop). You might then use a line_count variable which is incremented for each line and then tested to see whether it is equal to 25 (for a 25 line screen). If so, you request the user to press a key (enter, say) before resetting line_count to zero and continuing. You might like to try that as an excercise...

これがいきなり難しすぎる件。また投げそうになったわ。でも今度は日本語コミュニティがあるもん!というわけで本気でわからなかったら質問してみることにしよう。

おいおい、罠すぎ。ぐぐってみて笑っちまった。readline"s"じゃなくてreadlineを使うのかよ……
勘弁してくれよ。

# First open the file to read(r)
inp = open("menu.txt","r")
# read the file and print each line
line = inp.readline()
while line:
    print( line )
    line = inp.readline()
# Now close it again
inp.close()

一応ぐぐってみたらこういうソースが見つかった。つっても同じくAlan Gauldさんのところだけど。l2pってPythonのバージョン3用に書いてるやつか。内容も違うんだなぁ。もしかして2で勉強してるの失敗した?色々とプログラミングの世界は古いことが残ってるからなぁ、初学者はなんか先人の残したものがたくさんあるから2学んだ方がいいよみたいなこと聞いてというか読んでそうしてんだけど。もう時代は変わったのか?まぁ、こういう初学者向けのバージョン3の為のテキストが用意されてるぐらいだしなぁ……
まぁいいか、バージョンの新しいのに対応していくというのもまた勉強になるだろうし。
http://www.alan-g.me.uk/l2p/tutfiles.htm

というわけで、ソースに向かう。これは25行で区切るようにはなってない。なので25行で区切れやっていうバージョン2におけるAlanさんのいきなりきっつい問題には自己対処するわけになる。

うーん、ソースに向かうと考えてたことと違うなぁ、for文の場合にはインデントのブロックが終わってまたfor文の最初に戻ってきたときにlineで読み込んでいたfor line in inp.readlines():のが次の行になって、whileのときはそうじゃないから自分でインクリメントしなきゃならないと思っていたけど、このソースはそんなことちっともしとらん。
しかもwhileで評価しているときにはinpなんて参照せずにおそらくinpの一行目を読んでいるlineだけを見て評価している。もう何がなにやら。
でも一応ソースは書けるのでソースを書いて進んでいくか。後々わかっていくことになるだろう。と、またこういう後でわかるはずというので進んでいって失敗する道を犯すのかどうなのか。今度は日本語コミュニティもたくさん知ってるし大丈夫と思うけど。

inp = file("over100lines.txt","r")
linecount = 0
# read the file and print each line
line = inp.readline()
while line:
    print( line )
    linecount +=1
    line = inp.readline()
    if linecount == 25:
        raw_input("enter, say")
        linecount = 0
# Now close it again
inp.close()

一応自分のはこんな感じに仕上がりました。enter, sayっていう文言が正しいかどうかはわからないwただEnterを打てば25行目以降が表示されるのでクリア。ちなみにover100lines.txtの中身は実際言葉通り100行超えてない0から55までの数字を改行していって作ったファイル。ちなみに手動で作ったwちょwwwプログラミングまだ全然役立ってないwwww

さぁ、頭を悩ませた問題もコミュニティに質問することなくぐぐって解決した。まずぐぐれ、それでわからなかったら質問しろ、さぁ次に進もう!

However there is one little niggle you may have noticed in the previous example: the lines read from the file have a newline character at the end, so you wind up with blank lines using print (which adds its own newline). To avoid that Python provides a string method called strip() which will remove whitespace, or non-printable characters, from both ends of a string. (It has cousins which can strip one end only called rstrip and lstrip too) If we substitute the print line above with:

rstripで空行抜けるの確認。lstripだと抜けない。stripだと抜ける。おそらくファイルの中身を入れた変数の中をprint inpとかって確認したときにリスト?(それにしてはprint inp[1]とか出来なかったが。)みたいになっていて、その中身が'1/n',みたいに改行を表すnon-printable charactersが右についてるからかな?と思ったり。完全に素人予想なので違うかもしれない。

ていうか、上のwhile文を使ったループ、バージョン3のPythonの例だけあって、print ( line )とかなってるなぁ。print lineで動くか確認してみよう。動いた動いた。問題なし。一応さっき覚えたprint line.strip()を使って見栄えをよくしてみた。かっこいい!なんかプログラミング は じ ま っ た な 。という感じ。

次のDaily menuの出力には、さらに

print time.time()
print today

をtodayを定義した後に入れてみた。

1271054960.57
(2010, 4, 12, 15, 49, 20, 0, 102, 0)

という行が実行すると帰ってくる。なるほどねぇ。time.localtime(time.time())を通したtodayの値でやっと人間が日付として理解できる感じになっているわけだ。
さらにそれをtime.strftime("%A %B %d", today)で変換していく。
strftimeについてもpython strftimeとしてぐぐってみた。docs.python.org/library/timeという項目にぶち当たる。
# Python v2.6.5 documentation » # The Python Standard Library » # 15. Generic Operating System Services » 15.3. time — Time access and conversionsだそうだ。
Pythonドキュメンテーション凄いなぁ、充実してんなぁと思うのである。
確かにこれはPythonistaになる上で読むべきものである。Guid先生の言うとおり!

ここまでで割と時間掛かってるけど、得るものは多かった気がする。悩んだからね。一日で2ページ進めなかったし、"あああ"となっていたけど、なんかよく出来てるなぁ人生とは。何が

さっきirc://irc.2ch.net/pythonにてはじめての接触をした。Pythonで迷ったら質問する約束も取り付けたぜ。これで万事オッケー。これから問題なくPythonを進めていく手はずが整ったというものだ。
Debianの方は2chのスレが活発だし、Pythonのスレのほうもいくつかあってほとんど答えてもらえる。それにIRCまで加わった。初心者から中級者に掛けてはもはや怖いものなしだろう。そこから先はEmacsたんと自分で歩くぜ。きらん

This mysterious bit of code allows us to use any python file as a module by importing it, or as a program by running it. The difference is that when the program is imported, the internal variable __name__ is set to the module name but when the file is run, the value of __name__ is set to "__main__". Sneaky, eh?

これちょっと意味わかってない。

Study the code, see if you can find the mistakes (I've left, at least, two minor bugs for you to find, there may be more!) and try to fix them.

これも自分が手打ちで打って作り出したバグは見つけて実行にこぎつけたが、minor bugと書いてあるので、実行に関係ない部分なのだろうか、おそらくそのまま実行できてしまうと思う。それか僕が気づかずに手打ちするときに修正してしまえるぐらいのバグなのかもしえれないが。minor bugと書いてあるところを考慮すると、動作にはあまり関係しないし、動くけど記述がおかしいってところなんじゃないかな。一応コード読んだけどそれらしきところをこれだ!と見つけることは出来ず。どこだよ。てか、Whileとかファイル読みあたりから理解が怪しくなってきたから難しい。
Pythonドキュメンテーション読もうかしらん。

うーん、やっぱりWSH動かせんなぁwもう今後WSHを使うところは捨てていくかw

AttributeError: 'module' object has no attribute 'pack'
とか出てしまってだめだなぁ。structを使うところ。
うおお、すげえことが起こった。struct.pyって名前にReading & Writing Using Structのサンプルコードを貼り付けるコードの名前にしてたから、moduleでstructを引っ張ってくるときに自分自身を見つけていたwwwなんというwwww
それでエラーが出ていたのか。と思い、struct.pyを削除。で、python実行。しかし、またもやエラーが出る。
File "/usr/lib/python2.5/struct.py", line 12, in
となっているから今度はstructモジュールをきちんと読み込みに行ってはいるようだが。むむむ。

File "/usr/lib/python2.5/struct.py", line 7, in formatAddress
@: native order, size & alignment (default)
AttributeError: 'module' object has no attribute 'pack'

だそうだ。はっきり言って、何がなんだか。
もういいや、ここも飛ばすか。一応moduleで参照しているstruct.pyに行って、packのアトリビュート?というかファンクション?も見てきたんだが、ようわからん。Alan先生の講座と違うPythonのバージョンでも使ってるのか俺は。謎だ。

pythonを開いてプロンプトからimport structとやったら失敗した。なんか前に読み込んだのが悪さしてるみたいだなぁと思って再起動してみたらやはりそうだったみたいで、今度は通った。
それでついでに先程駄目だった、structを使うところのやつをやってみたけど、これは同様に駄目だった。そんで、またpythonのプロンプトでimport structを試してみたが、駄目になった。
この辺の挙動がさっぱりわからない。

でも、どんどん進んでいくことにする。今の時期は進んでいくことにより得られることの方が多い。
つうか、僕の目標的にPython Documentationを読むことのほうが増してきた。その方が面白いというか、どんどん力をつけられそう。alan.gauld先生のところはエラーが出たりしても、どういう感じでプログラムがなっているのかを学んでいく場にしていけたらいいと思う。
幸い?にも僕がこうやってエラーを出したりしているstructたんとかWSHは、もうこの章の後ほとんど出てこないようなので、今後はまたまともにalan.gauld先生たんの文章と向き合っていけるだろう。
明日はこの章を終わらせて、またさまざまな勉強の領域に入り込んでいきたい!エラーが出てもそれなりにどういう意味かはわかっていると思うので、感じが出てきた。

Random Access to Filesは実行も出来るし、理解もほとんど出来た。問題なす。

# Files can usually only be read or written but not both at the same time
# Python's readlines() function reads all the lines in a file, while readline() only reads one line at a time, which may help save memory.
# However in v2.4 onwards you don't usually need to use either since Python's file/open functions work with for loops.

まぁ、正直structのモジュール周りで問題が発生したのか、binary関係のところなんかはほとんど出来なかったのが残念だが、ファイル周りはぎこちなさそうだがなんとか出来そうなので終わりにして進む。個人的にはforとかwhileで使われるlineってのがマジック的な変数なんじゃないかと無茶気にしている。というか、変数ですらないのか?一度line以外の文字にして試してみるべきかなぁ。

とりあえずこの章終わりで。やっと終わった。