「Pythonの基礎 - ファイル」の版間の差分

ナビゲーションに移動 検索に移動
編集の要約なし
(ページの作成:「== 概要 == Pythonでは、ローカルに保存されたファイルからデータを読み込んだり、ファイルへデータを書き込むことができる。<…」)
 
編集の要約なし
132行目: 132行目:
  f.close()
  f.close()
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
== デキストファイルファイルの読み込み ==
==== 全体を読み込む (readメソッド) ====
ファイルに含まれるテキストを全て読み込む場合、<code>read</code>メソッドを使用する。<br>
<syntaxhighlight lang="python">
read(size=-1)
</syntaxhighlight>
<br>
引数を指定しない場合、ファイルを<code>EOF</code>(ファイルの終端)まで読み込み、文字列として返す。<br>
引数に最大文字数を指定する場合、指定した文字数分だけ読み込む。<br>
<br>
なお、読み込むファイルの文字エンコードと<code>open</code>関数で指定した文字エンコードが異なる場合、<code>read</code>メソッドを実行した時、例外<code>UnicodeDecodeError</code>が発生する。<br>
<br>
以下の例では、プログラムと同階層のディレクトリにmyfile.txtファイル(UTF-8)を作成している。<br>
<syntaxhighlight lang="python">
f = open('myfile.txt', 'r', encoding='UTF-8')
data = f.read()
print(data)
f.close()
</syntaxhighlight>
<br>
==== 行単位で読み込む (readlineメソッド) ====
ファイルから1行ずつファイルの内容を読み込む場合、<code>readline</code>メソッドを使用する。<br>
<br>
<code>readline</code>メソッドは、改行または<code>EOF</code>までファイルを読み込み、文字列として返す。<br>
引数に最大文字数を指定する場合、指定した文字数分だけ読み込む。<br>
ファイルの終端である<code>EOF</code>まで読み込むと空の文字列を返す。<br>
<syntaxhighlight lang="python">
readline(size=-1)
</syntaxhighlight>
<br>
以下の例では、<code>for</code>文および<code>while</code>文を使用して、ファイルの終端まで順にファイルの内容を読み込んでいる。<br>
<br>
なお、<code>readlines</code>メソッドの場合と同様、各行のデータには改行文字が含まれるため、<br>
必要な場合は、<code>print</code>関数で最後に改行を行わないようにする、または、読み込んだデータの末尾から改行を取り除くこと。<br>
<syntaxhighlight lang="python">
# for文を使用する場合
f = open('myfile.txt', 'r', encoding='UTF-8')
for data in f:
    print(data)              # 改行をそのまま出力する場合
    print(data.rstrip('\n'))  # 改行を取り除く場合
f.close()
# while文を使用する場合
f = open('myfile.txt', 'r', encoding='UTF-8')
while True:
    data = f.readline()
    if data == '':
      break
    print(data)              # 改行をそのまま出力する場合
    print(data.rstrip('\n'))  # 改行を取り除く場合
f.close()
</syntaxhighlight>
<br>
==== 行単位で分割してリストとして取得する (readlinesメソッド) ====
<code>readlines</code>メソッドを使用して、ファイル全体の読み込み後、読み込みしたデータを行単位で分割して、リストの要素として追加することができる。<br>
<br>
<code>readlines</code>メソッドは、引数に最大文字数を指定する場合、指定した文字数分だけ読み込む。<br>
<syntaxhighlight lang="python">
readlines(hint=-1)
</syntaxhighlight>
<br>
以下の例では、ファイルの内容を全て読み込み、行単位で分割してリストとして取得したデータを順に出力している。<br>
<br>
<code>print</code>関数を使用して出力する場合、各行のデータには改行文字が含まれており、<code>print</code>関数では最後に自動的に改行をするようになっているため、改行が2回出力される。<br>
そのため、<code>print</code>関数を使用して出力する場合、改行なしで出力する、または、出力するデータの末尾から改行を取り除くこと。<br>
<syntaxhighlight lang="python">
f = open('myfile.txt', 'r')
datalist = f.readlines()
for data in datalist:
    print(data, end='')      # 改行なしで出力する
    print(data.rstrip('\n'))  # 文字列の末尾から改行を取り除く
f.close()
</syntaxhighlight>
<br><br>
== テキストファイルの書き込み ==
テキストファイルへ書き込むためにファイルを開く場合、 <code>open</code>関数のモードとして<code>w</code>、<code>a</code>、<code>x</code>のいずれかを指定する。<br>
<syntaxhighlight lang="python">
f = open('myfile.txt', 'w')
f = open('myfile.txt', 'a')
f = open('myfile.txt', 'x')
</syntaxhighlight>
<br>
<code>w</code>を指定する場合、対象のファイルが存在していない時はファイルを新規作成して書き込む。<br>
ファイルが存在する時はファイルに上書きする。(既存のファイル内容は全て削除)<br>
<br>
<code>a</code>を指定する場合、対象のファイルが存在していない時はファイルを新規作成して書き込む。<br>
ファイルが存在する時は既存のファイル内容に追記して書き込む。<br>
<br>
<code>x</code>を指定する場合、対象のファイルが存在しない時はファイルを新規作成して書き込む。<br>
ファイルが存在する時は、例外<code>FileExistsError</code>が発生する。<br>
<br>
書き込むファイルの文字エンコードが、ユーザの環境のデフォルトエンコーディングと異なる場合は、文字エンコードを指定する。<br>
<syntaxhighlight lang="python">
f = open('myfile.txt', 'w', encoding='UTF-8')
</syntaxhighlight>
<br>
==== 上書き (wモード) ====
<code>w</code>モードでファイルを書き込む場合、ファイルが存在しない時はファイルを新規作成、ファイルが存在する時は上書きする。(既存のファイル内容は全て削除)<br>
<br>
テキストファイルに書き込む場合は、<code>write</code>メソッドを使用する。<br>
<code>write</code>メソッドの引数に、ファイルに書き込む文字列を指定する。<br>
<br>
<code>write</code>メソッドは最後に改行を書き込まないため、必要に応じて<code>\n</code>を合わせて書き込む。<br>
標準では、<code>\n</code>を書き込むと自動的に利用しているプラットフォームに合わせて改行が書き込まれる。<br>
例えば、MacOSの場合は<code>\r</code>、Windowsの場合は<code>\r\n</code>が書き込まれる。<br>
<syntaxhighlight lang="python">
f = open('myfile.txt', 'w')
f.write('こんにちは\n')
f.close()
</syntaxhighlight>
<br>
複数の文字列をまとめてファイルに書き込む場合は、<code>writelines</code>メソッドを使用する。<br>
引数には、文字列を要素としてリストを指定して、リストの要素を順にファイルに書き込む。<br>
<syntaxhighlight lang="python">
f = open('myfile.txt', 'w', encoding='UTF-8')
datalist = ['こんにちは\n', 'お元気ですか?\n', 'それではまた\n']
f.writelines(datalist)
f.close()
</syntaxhighlight>
<br>
<code>writelines</code>メソッドは自動的に改行を書き込まないため、必要に応じて、要素に格納する文字列に<code>\n</code>を記述する。<br>
<code>w</code>モードの場合はファイルが存在しても上書きで書き込むため、<code>open</code>関数で指定した文字エンコードを使用してファイルに書き込む。(既存のファイルの文字エンコードは無視される)<br>
そのため、文字エンコードが異なる場合でもエラーにはならない。<br>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:Python]]
[[カテゴリ:Python]]

案内メニュー