はじめに
ほとんどのプログラムは、何かから入力を読み取る必要があります。このセクションでは、ファイルアクセスについて説明します。
This tutorial is from open-source community. Access the source code
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
ほとんどのプログラムは、何かから入力を読み取る必要があります。このセクションでは、ファイルアクセスについて説明します。
ファイルを開く。
f = open('foo.txt', 'rt') ## 読み込み用に開く (テキスト)
g = open('bar.txt', 'wt') ## 書き込み用に開く (テキスト)
すべてのデータを読み込む。
data = f.read()
## 最大'maxbytes' バイトまで読み込む
data = f.read([maxbytes])
いくつかのテキストを書き込む。
g.write('some text')
終了したら閉じる。
f.close()
g.close()
ファイルは適切に閉じる必要がありますが、忘れるのは簡単なことです。したがって、好ましい方法は、次のように with
ステートメントを使用することです。
with open(filename, 'rt') as file:
## ファイル `file` を使用する
...
## 明示的に閉じる必要はない
...文
これは、制御がインデントされたコードブロックを離れるときに自動的にファイルを閉じます。
文字列を使ってファイル全体を一度に読み取る。
with open('foo.txt', 'rt') as file:
data = file.read()
## `data` は `foo.txt` のすべてのテキストが含まれた文字列です
イテレーションを使ってファイルを1行ずつ読み取る。
with open(filename, 'rt') as file:
for line in file:
## 行を処理する
文字列を書き込む。
with open('outfile', 'wt') as out:
out.write('Hello World\n')
...
print関数をリダイレクトする。
with open('outfile', 'wt') as out:
print('Hello World', file=out)
...
これらのエクササイズは、portfolio.csv
というファイルに依存しています。このファイルには、株式のポートフォリオに関する情報が含まれた行のリストがあります。あなたが ~/project/
ディレクトリで作業していることが前提となっています。もしあなたが確信できない場合、このようにしてPythonがどこを実行していると考えているかを調べることができます。
>>> import os
>>> os.getcwd()
'/home/labex/project' ## 出力は異なります
>>>
まず、大きな文字列としてファイル全体を一度に読み取ってみましょう。
>>> with open('portfolio.csv', 'rt') as f:
data = f.read()
>>> data
'name,shares,price\n"AA",100,32.20\n"IBM",50,91.10\n"CAT",150,83.44\n"MSFT",200,51.23\n"GE",95,40.37\n"MSFT",50,65.10\n"IBM",100,70.44\n'
>>> print(data)
name,shares,price
"AA",100,32.20
"IBM",50,91.10
"CAT",150,83.44
"MSFT",200,51.23
"GE",95,40.37
"MSFT",50,65.10
"IBM",100,70.44
>>>
上記の例では、Pythonには2つの出力モードがあることに注意してください。プロンプトで data
を入力する最初のモードでは、Pythonは引用符やエスケープコードを含む生の文字列の表現を表示します。print(data)
を入力すると、文字列の実際のフォーマット済み出力が得られます。
ファイルを一度に読み取ることは簡単ですが、それが最適な方法であるとは限りません。特に、ファイルが非常に大きい場合や、1行ずつ処理したいテキストの行が含まれている場合には、そうです。
ファイルを1行ずつ読み取るには、次のようにforループを使用します。
>>> with open('portfolio.csv', 'rt') as f:
for line in f:
print(line, end='')
name,shares,price
"AA",100,32.20
"IBM",50,91.10
...
>>>
このコードを示すように使用すると、ファイルの終端に達するまで行が読み取られ、その時点でループが停止します。
特定の場合、1行のテキストを手動で読み取ったり、スキップしたりしたい場合があります(たとえば、列見出しの最初の行をスキップしたい場合)。
>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f)
>>> headers
'name,shares,price\n'
>>> for line in f:
print(line, end='')
"AA",100,32.20
"IBM",50,91.10
...
>>> f.close()
>>>
next()
は、ファイル内の次のテキスト行を返します。何度も呼び出すと、連続した行が得られます。ただし、ご存知のように、for
ループはすでにデータを取得するために next()
を使用しています。したがって、明示的に1行をスキップしたり読み取ったりする場合を除き、通常は直接呼び出すことはありません。
ファイルの行を読み取り始めると、分割などのさらなる処理を行うことができます。たとえば、次のように試してみてください。
>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f).split(',')
>>> headers
['name','shares', 'price\n']
>>> for line in f:
row = line.split(',')
print(row)
['"AA"', '100', '32.20\n']
['"IBM"', '50', '91.10\n']
...
>>> f.close()
注: これらの例では、with
ステートメントを使用していないため、明示的に f.close()
が呼び出されています。
ファイルの読み取り方法を知ったので、簡単な計算を行うプログラムを書いてみましょう。
portfolio.csv
の列は、株式保有1つ分の銘柄名、株数、購入価格に対応しています。/home/labex/project
ディレクトリに pcost.py
という名前のプログラムを書いて、このファイルを開き、すべての行を読み取り、ポートフォリオ内のすべての株を購入するのにどれだけの費用がかかったかを計算します。
ヒント: 文字列を整数に変換するには int(s)
を使用します。文字列を浮動小数点数に変換するには float(s)
を使用します。
あなたのプログラムは、次のような出力を表示する必要があります。
Total cost 44671.15
gzip圧縮されたデータファイルのような非テキストファイルを読みたい場合どうすればよいでしょうか。組み込みの open()
関数はここでは役に立ちませんが、Pythonにはgzip圧縮ファイルを読むことができるライブラリモジュール gzip
があります。
試してみましょう。
>>> import gzip
>>> with gzip.open('portfolio.csv.gz', 'rt') as f:
for line in f:
print(line, end='')
... 出力を見てみる...
>>>
注: ここでは 'rt'
のファイルモードを含めることが重要です。それを忘れると、通常のテキスト文字列ではなくバイト文字列が得られます。
データサイエンティストは、Pandas のようなライブラリにはCSVファイルを読み取る関数が既にあることをすぐに指摘します。これは正しいです。そして、それはかなりうまく機能します。しかし、これはPandasを学ぶコースではありません。ファイルの読み取りは、CSVファイルの詳細よりも一般的な問題です。CSVファイルを扱っている主な理由は、それがほとんどのコーダーにとって馴染みのある形式であり、直接扱いやすいからです。この過程で多くのPython機能を示しています。だから、仕事に戻ったときにはPandasを使ってください。しかし、このコースの残りの部分では、標準のPython機能にとどまります。
おめでとうございます! あなたはファイル管理の実験を完了しました。あなたのスキルを向上させるために、LabExでさらに多くの実験を練習することができます。