2.1 ファイルを読む一 63 これを取り除くにはループのボディ部分の最初にこの 1 行を追加 この方法も各行末の \ n がそのままだが、 すれば良い・ = line. rstrip(' \n' ) line さらにまた、各行の最後にぶら下がった空白 ( \ n だけではなく ) を避ければよいだけなら、 = line. rstrip( ) line 考察 もっと簡単だ・ 読もうとしているファイルがよほど巨大でない限りは、全体をひとかたまりにしてメモリに吸い込んでし まうのが、その後のどんな処理に対しても最も速くて簡便な方法である。ビルトイン関数 open は thon の ファイルオプジェクトを生成する ( 代わりにビルトインの型である file を呼び出しても同じことである ) 。 のオプジェクトの read メソッドを呼び出すと、ファイルの内容はすべて ( テキストでもノヾイナリでも ) 1 つの 長い文字列として得ることができる。内容がテキストなら、 split メソッドか、もしくは行分割に特化した splitlines メソッドのどちらででも、その文字列を即座に分割して行のリストにすることができる。行への分 割は頻繁に必要となるので、より速く手つ取り早い操作としてファイルオプジェクトの readlines を直接呼び 出してもよいだろう。 ファイルオプジェクトの上を直接ループすることもできるし、 list や max のように、反復可能体を取るコー ラブルに渡すこともできる。こうして反復可能体として扱われる時、読み込みのためにオープンされたファ イルオプジェクトは、このファイルのテキスト行を反復アイテムとして持っことになる ( つまり、テキスト ファイルのみを対象とすべきである ) 。この種の 1 行すつの繰り返し処理はメモリ消費量の点でも安価な上、 それなりに速くもある。 Linux 、 Mac OS X 、それに他の BSD 由来のシステムのような Unix および Unix 的なシステムにあっては、 テキストファイルとバイナリデータファイルに現実的な差異はない。 Windows や、かなり古い Macintosh で は、なぜか標準的な行末コード \n ではなくて、 \r\n と \r によってそれぞれ工ンコードされている。 Python は ューザの代わりにこれらの行末文字を \n に変換してくれる。バイナリファイルを開く場合はこの逆で、この ような変換作業をしないように thon に伝えなければならない。それには open の第 2 引数に rb を使えばよ い。これは Unix 的なプラットフォームにおいても無難な方法だし、その場では必要なくても常にバイナリ ファイルとテキストファイルを区別するのは良い習慣である。こうした習慣によってプログラムは飛躍的に 読みやすくなるものだし、別のプラットフォームとの互換性も向上する。 テキストファイルの行末ルールがあやふやな時は、 open の第 2 引数として rU を使ってユニバーサルな行末 変換をリクエストすべきである。そうすれば Windows 、 Unix (MacOSX を含む ) 、古い Macintosh のテキス トファイルも安心して自由に交換することができる。コードが実行されているプラットフォームに関らす、行 末が全て \n となるからである。 「解法」の最初のコードで示したように、 open 関数で生成されたファイルオプジェクトに対して、 read など のメソッドを直接呼び出すこともできる。この場合、読み込み処理の完了と同時にファイルオプジェクトへ のリファレンスは失われる。実行した時、 Python はリファレンスがなくなったことに即座に対応して、速や かにファイルをクローズしてくれる。とはいえ、ファイルを使い終った時に自分自身できちんと close を呼ぶ
xxiv 一目次 1.23 XML や HTML 向けに Unicode データをエンコード・・ 1.24 一部の文字列のみ大文字小文字無関係にする・・・ 1.25 Un ⅸターミナル上で HTML をテキストに変換・・ 2 章ファイル・・・ イントロダクション・・ 2.0 ファイルを読む・・ 2.1 ファイルに書き込む・・ 2.2 ファイル中のテキストの検索置換・・ 2.3 ファイル中の特定の行を読み込む・・ 2.4 ファイルの行数を数える・・ ファイル中の全てのワードを処理する・・ 2.7 入出力をランダムアクセスで・・・ ランダムアクセスファイルの更新・・・ 2.8 zip ファイルのデータを読む・・ 2.9 文字列の中の zip ファイルの扱い・ 2.10 ファイルツリーを tar ファイルにして圧縮・・ 2.11 バイナリデータを Windows の標準出力に送る・・ 2.12 C + + 的な iostream シンタックスを使う・ 2.13 不可逆ストリーム入力のファイルを巻き戻す・・ 2.14 「ファイル的」オプジェクトを普通のファイルオプジェクトに 2.15 ディレクトリツリーの探索・・ 2.16 ディレクトリツリーに散在するファイルの拡張子を変更・・・ 2.17 サーチパスにあるファイルを見つける・・ 2.18 サーチパスとパターンマッチでファイルを見つける・・ 2.19 thon サーチパスにあるファイルを見つける・・ 2.20 th 。 n サーチパスの動的変更・・・ 2.21 相対パスを導き出す・・ 2.22 バッフアされない文字をプラットフォームに依存せずに読む・・ 2.23 Mac OS X で PDF のページ数を数える・・ 2.24 Windows でファイル属性を変更する・・ 2.25 OpenO 伍ce.org 文書からテキストを抽出・ 2.26 Microso れ Word 文書からテキストを抽出・・ 2.27 プラットフォームに依存せず API でファイルロック・・ 2.28 ファイル名にバージョンを・・ 2.29 CRC -64 の計算・・ 2.30 3 章時間とお金・・ -8 -1 【 0 7 0 ーワ 0 【 0 0 / -8 9 」ワ 0 -4 【〔 / 0- ワ 0 つけ L-O -8 9 、 0 ワ 0 つひ -4 【 / -0 -1 ワ 0 【っー 9 、 3 -1 1 -1 一 1 1 -11 -1 5
ファイル 2.0 イントロダクション credit: Mark Lu レ訳 : 吉宗貞紀 さて、ファイルである一一そこそこ実践経験があるプログラマであれば、プログラミング言語に用意され たツール・ポックスの中でも、まず手を伸ばすものである。外部ファイルの操作は手にさわれるような実体 を伴ったとても現実的な作業であり、ファイル処理インタフェースの出来、不出来はそのプログラミング・ ツールの実用性を測る良い目安となるから、ますはその辺を見てみよう。 この章のレシピが証明するように、 thon はこの作業に関しても光り輝いている。ファイルのサポートは、 ビルトインの open 関数 ( 基本的な file オプジェクトの型と同義語 ) から、 os のようにこれに特化した標準ライ プラリモジュール、さらにはウエプから入手可能なサードバーティのユーティリティまで、いろいろな階層 に及ぶ。つまるところ、 python のファイルツールの武器庫は、スクリプトがファイルアクセスする際に複数 の強力な手法を提供できるのだ。 ファイルの基本 thon において、ファイルオプジェクトはビルトイン型 file のインスタンスである。ビルトイン関数 open はファイルオプジェクトを生成して戻り値にする。第 1 引数の文字列でファイルのパス ( 任意のディレクトリ パスを前置できるファイル名 ) を指定する。次の引数もまた文字列で、ファイルをオープンするモードを指定 する。たとえば : input = open('data' output = open('/tmp/spam' open は、ディレクトリとファイルがスラッシュ ( / ) で区切られたパスを受け付ける。これは下で走っている オペレーティングシステムが何であれ同じである。スラッシュを用いないシステムでは、代わりにバックス ラッシュ ( \ ) を使うこともできるが、実際にはそうする意味は全くない。バックスラッシュは二重にするか raw 文字列 ( raws ⅲ ng ) を用いなければ使用できないので、文字列リテラルにきれいにフィットさせることが難し い。ファイルバス引数がファイルのディレクトリ名を含んでいなければ、そのファイルは現在作業中のディ
78 ー 2 章ファイル たり、データファイルそのものを処理することもできる。このレシピは zipfile. zip という zip アーカイプに含 まれる全てのファイルのファイル名とデータ長を一覧するものである。 今のところ、 zipfile モジュールは複数のディスクに分割された zip ファイルや付加コメントのある zip ファ イルは扱えない。フラグ引数としてて b ( Wmdows などではこちらの方が自然に見えるかも知れないが ) ではな くて r を使うことに注意しよう。 ZipFiIe メソッドでは、ファイルをオープンするときとフラグの使い方が異 なるので、 rb では認識されない。てフラグで、どのプラットフォームでも元々バイナリの性質を持っている zip ファイルを処理できる。 zip ファイルが、他のデータなどのファイルと一緒に Python のモジュール (. py 、望ましくは . pyc ファイル を意味する ) を格納している場合、そのファイルのパスを thon の sys. path に追記すれば、 import 文で zip ファイル中からモジュールをインポートできる。ここに示すのは、オン・ザ・フライでそうした zip ファイル を生成し、そこからモジュールをインポートした後で廃棄するという、純粋にデモンストレーションとして、 自己完結的なおもちゃのような例である。見れば、それぞれの作業がどのように実行されるかがわかるだろ import zipfile, tempfile, os, sys handle, filename = tempfile. mkstemp(' . zip' ) os. close(handle) = zipfile. ZipFile(fiIename, 'w' ) z. writestr('hello. py' , 'def f( ) : return " he110 world 行 om " + z. close( ) sys. path. insert(), filename) import he110 print he110. f ( ) os. unlink(filename) このスクリプトを実行するとこんな感じの出力が得られる : he110 world from /tmp/tmpESVzeY. zip/hello. py file このリストでは、 rthon が zip ファイルからインポートできる能力を明らかにする一方で、どのようにし てテンボラリファイルを作成する ( そして後で削除する ) か、どのように w ⅱ testr メソッドを使って、ディス クに置くことなく zip ファイルにメンバーを追加するかをも示している。 インポート元の zip ファイルへのパスが、どことなくディレクトリのように扱われていることに注意された い ( この実行例ではパスは / tmp / tmpESVzeY. zip になっているが、もちろん使っているのがテンボラリファイ ルだからである。このパスの正確な値はプラットフォームにも依存するし、実行するたびに変わる ) 。詳細に 見ると、 zip ファイルからインポートされる he110 モジュール内のグローバル変数 file ーの値は /tmp/ tmpESVzeY. zip/hello. py という仮想のもので、「ディレクトリ」のように見える zip ファイルのパスの後に、 zip ファイル内における he Ⅱ 0. py の相対パスを繋げた形になっている。データファイルにアクセスするために自分 からの相対パスを計算するようなモジュールを zip ファイルからインポートする時には、このような「仮想パ ス」を open してもファイルオプジェクトを得ることはできないから、この現象に合わせてモジュールを修正
108 ー 考察 2 章ファイル raise RuntimeError, return False "Can't %s % ら a11 names taken"%(vtype,file_spec) name import OS maln # ダミーファイルとして "test. txt" を作成する tfn = 'test. txt' open(tfn, ・Wつ . close( ) # 3 回バージョンの付与を行なう print VersionFiIe(tfn) # 出力 : True print VersionFiIe(tfn) # 出力 : True print VersionFiIe(tfn) # 出力 : True # 今作成した全ての test. txt* ファイルを削除する for x in ( ' .006 ・ .002 ' ) : .00r os. unlink(tfn + x) # ファイルが存在しないと何が起きるか示す print VersionFiIe(tfn) # 出力 : FaIse print VersionFiIe(tfn) # 出力 : FaIse Ve て sionFile 関数の目的は、ファイルをオープンして、書き込んだりアップデートすることで内容を変更す る前に、既に存在しているファイルについては確実にコピーを取っておく ( もしくはオプションの第 2 のパラ メータで指定できるようにリネームしておく ) ということである。ファイルの内容を滅茶苦茶にしてしまう前 にこうしたファイルのバックアップを取っておくのは洗練されたやり方と言えるにれを自動的にこなしてく れる、古き良き VMS オペレーティングシステムの機能を未だに切望している人達もいる ! ) 。正確なコピー 作業とリネーム作業は shutil. copy と os. rename がそれぞれやってくれるから、唯一の問題はターゲットとし てどんな名前を付けるか、ということだけである。 バックアップファイル名の付け方で、よくある方法はバージョン番号の付与である ( ファイル名に順に増え ていく数字を付加する ) 。このレシピでは新しいファイル名を付けるにあたって、まずファイルネームのルー ト部分 ( 最後のドット以下を取り除いた部分 ) を抽出し ( 既にバージョンが付与されたファイルを呼び出した場 合を考えてほしい ) 、次いでルート部分により大きい拡張子 .000 や .001 などなどを、この方法で作成したファ イル名が既に存在しているファイル名とぶつからないように追加する。そうして初めて、コピーやリネーム のターゲットとなるファイルに新しい名前が適用される。 VersionFiIe は 1 , 000 バージョンまでに制限されて いることに注意されたい。それ以降はアーカイプを作成することを考えるべきである。ファイルはその最初 のバージョン付与の時点で実際に存在していなければならない。まだ存在もしていないものをバックアップ することなどできないからである。そこで、もしファイルが存在しなかった場合、 VersionFiIe 関数は単純に Fa1se を返して来る ( ファイルが存在しており、バージョン付与に成功した場合は True を返す ) 。つまり、これ
58 ー 2 章ファイル レクトリにあるものとみなされる ( import 処理に適用される thon のモジュールサーチパスとは全く異なる 考え方である ) 。 モード引数としては、ファイルをテキストモードで読み込む場合てを使用する。これはデフォルト値であり 普通は省略されるので、 open を 1 つの引数で呼び出すこともできる。他の一般的なモードとして、バイナリ モードでの読み込みに rb 、テキストモードでのファイルの作成と書き込みに w 、バイナリモードでのファイ ル作成と書き込みに wb を用いる。 r のバリエーションとして重宝するものに rU がある。これはファイルを「ユ ニバーサル改行」のテキストモードで読み込むよう thon に指示する。て U モードではテキストファイルを、 そのファイルが用いている改行コードに合わせて読み込むことができる。それが Un ⅸであれ、 Windows であ れ、 ( 古い ) Macintosh であったとしても ( 現在の MacOSX は誰がどうみても Un ⅸであるが、ちょっと前の Mac OS 9 までは全く異なっていた ) 。 非 Unix 的なプラットフォームではテキストモードとバイナリモードを識別することが重要だが、これは使 われている行末コードのためだ。バイナリモードでファイルを開いた場合、 thon は行末コードに注意を払 わなくてもよいと判断する。ファイルやメモリ上の文字列をただバイト単位で移動し、何の変換もしない。し かし非 Un ⅸ的なシステムでファイルをテキストモードで開いた場合には、 thon は文字列で使われている行 末コード \n を、現在のプラットフォームがファイル内で使っている何かと相互に変換する。ファイルを開く 際には、テキストなのかバイナリなのか、モードを適切に示しておけば、コード上では \ n が常に行末コード であると信頼できる。 このあとすぐに触れるが、ファイルオプジェクトを生成すると、そのオプジェクトのメソッドを呼び出す ことにより全てのファイル入出力作業を行えるようになる。ファイルの操作が終わったら、最後にこのオプ ジェクトの close メソッドを呼び、ファイルとの接続を閉じるべきである : input. close( ) 短いスクリプトではしばしばこのステップが省略される。 thon は、ガべージコレクションの過程でファ イルオプジェクトを再利用する際に、自動的にファイルをクローズするからであるにれは現在主流の thon では、ファイルはほとんど即座にクローズされることを意味する。一方、他の重要な thon 実装である J hon や lron th 。 n などは、もっと緩やかなガべージコレクション方針を採用している ) 。いずれにせよファイルを できるだけ早くクローズすることは良いプログラミング習慣であり、大きなプログラムー一言い換えると、使 用しない余計なファイルがオープンされたままごろごろしていることのリスクがより高いであろうプログラ ムでは、特に推奨される考え方である。ちなみに確実なファイルのクローズには try / finally を使うとよい。 これならキャッチされない例外により関数が終了する場合でもクローズが保証される。 ファイルに書き込むには write メソッドを用いる : output. write(s) s は文字列である。 s は output がテキストモード書き込みでオープンされたときはキャラクタ列、バイナリ モード書き込みでオープンされたときはバイト列であると考えてほしい。ファイルには書き込みに関するメ ソッドが他にも存在する。たとえば flush はバッフアされた全てのデータを送出するし、 writelines は一度の 呼び出しで複数の文字列を続けて書き込む。とはいえ、圧倒的に広く使われるメソッドが w ⅱ te であることは
2.9 zip ファイルのデータを読む一〃 thon は zip ファイル中のデータを直接処理できる。書庫のディレクトリにあるアイテムの一覧を参照し て再びオープンして更新するというのがやはり普通である。 を付けてファイルをオープンしてデータを書き込むことで作成し、一旦クローズした後で、今度はて + b を付け w + b を使うこともできるが、この妙な組み合わせの要求を目にしたことはない。バイナリファイルは、引数 wb ライプラリリファレンスおよび fPython クイックリファレンス』の、 file オプジェクトと struct モジュー 参照 から読み込むという点だけである。 record size とオフセットを、このレシピで示したように自分で計算するのではなく、インデックスファイル シピで示したものと非常に良く似たものになるだろう。唯一の違いは、 t h e f i 1 e . s e e k に引数として渡す なお、インデックス付シーケンシャルファイルにアクセスする必要が生じたときには、そのコードはこのレ 種多様だが ) かデータベース、そしてまれに固定レコード長のバイナリファイルだけになっている。それでも 現在遭遇するのは、テキストファイル ( とは言っても、しばしば XML ファイルであったりと、その種類は多 付与したシーケンシャルアクセスの手法は、単なる格好付けなどではなく、かっては非常に重要であったが、 フセットやレコード長を参照するという、さらに高度な処理の可能性も存在する。こうしたインデックスを して、別の独立した「インデックスファイル」によって、「データファイル」の中のそれぞれのレコードのオ このアプローチが、全てのレコードサイズが同じであるようなファイルに対してしか汎用性がないのに対 ルに関するセクション、 fperl クックプック』の「レシピ 8.13 」。 zip ファイルはポピュラーでクロスプラットフォームなアーカイプ形式である。 PYthon 標準ライプラリは 解法 ことなく直接調べたい。 zip 形式の圧縮書庫に格納されたファイルのいくつか、もしくは全てを、ディスク上に解凍する 問題 credit: paul Prescod, AIex MarteIIi 訳 : 吉宗貞紀 2.9 zip ファイルのデータを読む zipfile モジュールによって zip ファイルに簡単にアクセスできる : 考察 print 'has' , len(bytes), 'bytes' bytes = z. read(filename) filename, print ' File: ' fo て filename in z. namelist( ) : Z = zipfile. ZipFi1e("zipfile. zip', import zipfile
2. O イントロダクション一 59 りし、なし、。 ファイルの読み込みは書き込みよりも頻繁に行われ、考慮すべき事項も多いために、ファイルオプジェク トでは書き込みよりも多くのメソッドが準備されている。 readline メソッドはテキストファイルの次の行を読 み込んで返す。このループをよく見てほしい・ while True : = input. readline( ) line if not line : break process(line) これはかっては thon では決まり文句になっていたが、今となっては、あるファイルから全ての行を読み 込んで処理するためのベストな方法ではない。現在では代わりにファイル全体を読み込んで行のリストを返 す readlines メソッドを使う・ fo て line in input. readlines( ) : process(line) て eadlines はファイルが物理メモリの中にすつほり収まる場合においてのみ有用である。ファイルが滅茶苦 茶に大きいとて eadlines は動作に失敗したり、動いたとしても非常に露骨な速度低下を招く ( 仮想メモリが一 杯になり、オペレーティングシステムは物理メモリの内容をディスクにコピーし始めなければならない ) 。現 在の python では、ファイルオプジェクトそのものの中をただループして 1 行ずっ取り出せば、メモリとパ フォーマンスについて優れた特性が得られる : f0 て line in input: process(line) もちろんファイルを 1 行ずつ読みたい場合ばかりではない。ファイルのバイトデータの一部または全てを 読み込みたいこともあるだろう。そもそもファイルをバイナリモードで開いた場合は、行という概念そのも のが意味をなさない。こうした場合に使えるのがて ead メソッドである。引数なしで呼び出すとて ead はファイ ルの残りのバイトデータ全てを読み込んで返してくる。整数 N を引数とすると、次の N バイト ( ファイルの残 りが N バイト以下であれば全て ) について同じことをする。この他に記述に値するメソッドといえば、ファイ ルへのランダムアクセスをサポートする seek と tell だろう。これらは通常、固定長のレコードで構成された バイナリファイルに対して使用する。 可搬性と柔軟性 表面的にみると、 thon のファイルサポートは素直なものだ。しかし、この章のコードを熟読してもらう 前に、私は thon のファイルサポートが持っ 2 つの側面を強調しておきたい。それはコードの可搬性とイン タフェースの柔軟性である thon のほとんどのファイルインタフェースには、プラットフォームの領域を越えた完璧な可搬性がある ことを覚えておいてほしい。この仕様の重要性については、いくら語っても大げさではない。たとえば、
2. IO 文字列の中の zip ファイルの扱い一 79 する必要がある。さらに言えば、 zip ファイル内のファイルを読み書きする時には、「解法」でも示したよう に、標準ライプラリの zipfile モジュールの関数を用いなければならない。 参照 ライプラリリファレンスおよび「巧 rthon クイックリファレンス』の zipfile モジュールに関するドキュメ ント、 tempfile 、 os 、 sys の各モジュール、ファイルツリーの圧縮については「レシピ 2.11 ファイルツリーを 筆者はしばしばこの問題に直面していることに気づかされる。たとえば、データベースの BLOB (Binary 考察 ZipFi1e. init (self, cString10. String10(datastring)) init_(self, datastring) : class ZipString(ZipFile) : from zipfile import ZipFile import cString10 この種の問題を解決するには、標準ライプラリの ( St ⅱ ng10 がまさに適任である : 解法 中の情報を読み取りたい。 プログラムが、メモリ上にバイト文字列として zip ファイルを収めている時、その zip ファイル 問題 credit: lndyana Jones 訳 : 吉宗貞紀、鴨澤眞夫 2 コ 0 文字列の中の zip ファイルの扱い tar ファイルにして圧縮」。 ほどではないにしても ifisinstance(), y ) などと書く ) をすべきでないのはなぜか、あなたに教えるものでも ズムの底知れぬパワーを物語るものであり、コードの中で型チェック ( おぞましい if type(x) is y や、それ 呼び出した時に適切に応答する限り、全てはうまく動作する。このことはシグネチャベースのポリモーフィ するメソッドを呼び出すだけである。そのオプジェクトがそれらのメソッドの要求を満足させ、メソッドを ル的な」オプジェクトを渡すことができる。モジュールのコードは、それが何であれ、オプジェクトが要求 ほとんどの thon モジュールは、渡されたのが本当に file であるかどうかをチェックしないので、「ファイ んでおいて、後でその内容をバイト文字列として読み出すこともできる。ファイルオプジェクトを受け取る てくれる。逆に ( St ⅱ ngIO. St ⅱ ng10 インスタンスに、あたかもファイルオプジェクトであるかのように書き込 cString10 モジュールはバイト文字列をラップして、ファイルオプジェクトとしてアクセスできるようにし ルを利用することを思いっき・・ ・・もう、振り返ることはしなかった。 業が終わったらしつかりと削除していたが。その後、同じ目的のために標準ライプラリの cSt ⅱ ng10 モジュー リデータは一時ファイルとして保存してから標準ライプラリの zipfile モジュールで開いていた。もちろん作 Large OBject) フィールドや、ネットワークから持ってきた zip ファイルなどだ。かっては、そうしたバイナ
66 ー 2 章ファイル るようにしておく方が安全である : file object = open('thefile. txt' , file object. write(all the text) file 0bject. close( ) こでも、ファイルオプジェクトを名前に結合し、作業が終わった時に速やかに close メソッドを呼び出せ もできる。この r + b オプションについては「レシピ 2.8 ランダムアクセスファイルの更新」を見てほしい。 ションを使えば、 open された 1 つのファイルオプジェクトに対して、読み込みと書き込みの両方を行うこと あれば、オプションとして a ( もしくは (b) を用いてファイルを open しなければならない。さらに高度なオプ だけである。もし、書き込もうとするデータをファイルの以前の内容に付け加える形 ( Append ) にしたいので 仮にファイルオプジェクトを open してすぐに close したとしても、ディスク上には空つほのファイルが残る w ( もしくは wb ) オプションを付けてファイルを open すると、そのファイルの中のデータは即座に消去される。 は、正反対の性質を持っている。 や利便性を考慮して、まとめてやつつけるのか少しすっ操作するのか決める場合には、読み込みと書き込み writelines で書き込もうとするよりも、データが来るたびに write を使った方が良いだろう。パフォーマンス ないのであれば、データの断片をテンボラリなリストに組み上げて ( たとえば append などで ) 最後に一気に ら、 writelines メソッドを 1 回だけ使用するのがシンプルで高速である。逆にデータが少しすっしか準備でき 全部の作業が終わったらファイルオプジェクトの close メソッドを呼ぶ。全てのデータを 1 度に揃えられるな ぶだけでよい。どちらのメソッドも、ファイルの末尾、既に書き込まれたデータの後にデータを書き加える。 書き込みたい文字列や文字列シーケンスが準備できたら、 write メソッドか writelines メソッドを繰り返し呼 ちょっとすっファイルに書き込みたい、というのは、ちょっとすっ読み込むよりもありがちな状況である。 ンボラリバッフアなどではなく、きちんとディスクに保存されたことを確実なものにできるからだ。 ルを速やかにクローズすることがより大切である。ファイルをクローズして初めて、データがメモリ上のテ に述べたのと同様の考え方がここでも適用できるが、読み込みに比べて書き込みの場合は、使用後のファイ テキスト的なデータであれば w 、バイナリデータであれば wb とする。「レシピ 2.1 ファイルを読む」の中で既 書き込むためのファイルオプジェクトを生成する場合、 open ( または file ) には必す第 2 引数を渡す。これは 考察 速い。 出したり、ループの中で w ⅱ te メソッドを繰り返すよりも、最初から writelines を呼び出したほうがはるかに 複数の文字列を 1 つの文字列に結合して ( たとえば join メソッドを使って ) それから w ⅱ te メソッドを呼び open('abinfile' 'wb' ). writelines(list 0f data strings) file 0bject. writelines(list 0f text strings) ストと同じように処理できる ) を用いる : この場合、 writelines メソッド ( 名前は writelines だが、行形式に限らない。バイナリデータであってもテキ 書き込みたいデータが 1 つの大きな文字列ではなくて、リストなどのシーケンスの要素であることも多い。