Python入門　入力と出力

# 入力と出力
プログラムには、文字を出力したり、データを読み込んだりして処理をすることがあります。ここではそのいくつかかの方法を紹介します。

## 出力のフォーマット
文字や値を出力するするには、主にprint()関数がありますが、他にもいくつかの出力方法があります。

### フォーマット済み文字列リテラル
fまたはFを前につけて、{}で囲うとフォーマット済み文字リテラルを使用できます。

```python
year = 2020
event = '東京オリンピック'
f"{event}は、{year}年に開催されます。"
```
```:実行結果
'東京オリンピックは、2020年に開催されます。'
```

次の例では、小数点３桁以下を丸めてフォーマットしています。

```python
import math
print(f'円周率は{math.pi:.3f}です。')
```
```:実行結果
円周率は3.142です。
```

':' の後ろに整数をつけると、そのフィールドの最小の文字幅を指定できます。

```python
data = {'太郎': 4127, '二郎': 4098, '花子': 7678}
for name, code in data.items():
    print(f'{name:10} ==> {code:10d}')
```
```:実行結果
太郎         ==>       4127
二郎         ==>       4098
花子         ==>       7678
```

 '!a' は ascii() を、 '!s' は str() を、 '!r' は repr() を適用します。

```python
animal = '猫'
print(f'この動物は、{animal}です。')
```
```:実行結果
この動物は、猫です。
```

```python
animal = '猫'
print(f'この動物は、{animal!r}です。'
```
```:実行結果
この動物は、'猫'です。
```

### 文字列の format() メソッド
 str.format() メソッドは、次のように書くことができます。()の中に書いた変数を順番に{}に渡すことができます。

```python
yes = 2_356
no = 2_121
percentage = yes / (yes + no)
'{:-5} YES  {:2.2%}'.format(yes, percentage)
```
```:実行結果
' 2356 YES  52.62%'
```

str.format() メソッドをもっともシンプルに書くと以下のようになります。

```python
print('お寿司は{}と{}からなります。'.format('ネタ', 'シャリ'))
```
```:実行結果
お寿司はネタとシャリからなります。
```

{}の中に数値を書くことで、変数の順番を変えることができます。

```python
print('{0} and {1}'.format('シャリ', 'ネタ'))
```
```:実行結果
シャリ and ネタ
```

```python
print('{1} and {0}'.format('シャリ', 'ネタ'))
```
```:実行結果
ネタ and シャリ
```

str.format() メソッドに、キーワード引数が渡された場合は、出力される値はキーワード引数によって参照されます。

```python
print('ネギトロは{rice}と{neta}を海苔で巻いたものです。'.format(rice='シャリ', neta='マグロ'))
```
```:実行結果
ネギトロはシャリとマグロを海苔で巻いたものです。
```

順序引数とキーワード引数を組み合わせて使うこともできます。

```python
print('ネギトロは{0}と{1}を{other}で巻いたものです。'.format('シャリ', 'マグロ',other='海苔'))
```
```:実行結果
ネギトロはシャリとマグロを海苔で巻いたものです。
```

以下のように、辞書を引数に渡して、角括弧 '[]' を使って辞書のキーを参照することで可能です。

```python
data = {'太郎': 4127, '二郎': 4098, '花子': 7678}
print('太郎: {0[太郎]:d}; 二郎: {0[二郎]:d}; '
      '花子: {0[花子]:d}'.format(data))
```
```:実行結果
太郎: 4127; 二郎: 4098; 花子: 7678
```

'**'を使ってキーワード引数として渡す方法もあります。

```python
data = {'太郎': 4127, '二郎': 4098, '花子': 7678}
print('太郎: {太郎:d}; 二郎: {二郎:d}; 花子: {花子:d}'.format(**data))
```
```:実行結果
太郎: 4127; 二郎: 4098; 花子: 7678
```

### str()
str()関数も文字や数値を表示することができます。

```python
s = "こんにちは"
str(s)
```
```:実行結果
'こんにちは'
```

```python
s = 1/3
str(s)
```
```:実行結果
'0.3333333333333333'
```

### repr()
str()関数も文字や数値を表示することができますが、文字列を出力するときはダブルクォーテーションがつきます。

```python
s = "こんにちは"
repr(s)
```
```:実行結果
"'こんにちは'"
```

```python
s = 1/3
repr(s)
```
```:実行結果
'0.3333333333333333'
```

### str.rjust()
str.rjust()関数を使用すると、指定した数値だけ右に寄せて表示します。

```python
s = 'abc'
print(s.rjust(8))
```
```:実行結果
     abc
```

第二引数で、埋める文字を指定することもできます。

```python
print(s.rjust(8, '+'))
```
```:実行結果
+++++abc
```

### str.ljust()
str.ljust()関数を使用すると、指定した数値だけ左に寄せて表示します。


```python
s = 'abc'
print(s.ljust(8))
```
```:実行結果
abc     
```

第二引数で、埋める文字を指定することもできます。


```python
print(s.ljust(8, '+'))
```
```:実行結果
abc+++++
```


### str.center()

str.center()関数を使用すると、中央寄せにすることができます。埋める文字数が奇数の場合は右側が1文字多くなります。

```python
s = 'abc'
print(s.center(8))
```
```:実行結果
  abc   
```

第二引数で、埋める文字を指定することもできます。


```python
print(s.center(8, '+'))
```
```:実行結果
++abc+++
```

### str.zfill()

zfill()関数を使用すると、右寄せでゼロ埋め（ゼロパディング）することができます。

```python
s = 'abc'
print(s.zfill(8))
```
```:実行結果
00000abc
```

## ファイルの読み書き
ファイルの読み込み、書き込みにはopen()関数を使用します。ファイルを読み込みのときは、引数のモードを'r'として、書き込みのときは引数のモードを'w'とします。

### open()とclose()とread()
通常、open()関数を使用するときは、単体で使用することはほとんどなく、close()関数や読み込みのときはread()関数と一緒に使用します。以下の例は、text.txtというファイルを開いて読み込んで表示するまでを書いています。

```:text.txt
吾輩わがはいは猫である。
名前はまだ無い。
どこで生れたかとんと見当けんとうがつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。
しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。
```
```python
path = 'text.txt'
f = open(path)
s = f.read()
print(s)
f.close()
```
```:実行結果
吾輩わがはいは猫である。
名前はまだ無い。
どこで生れたかとんと見当けんとうがつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。
しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。
```

### open()とwith
open()関数を使用するときは、必ずファイルを閉じる必要があり、close()関数でファイルを閉じることができますが、次のような書き方をすれば、close()関数の代わりにwithでファイルを閉じることができます。

```python
path = 'text.txt'
with open(path) as f:
    s = f.read()
    print(s)
```
```:実行結果
吾輩わがはいは猫である。
名前はまだ無い。
どこで生れたかとんと見当けんとうがつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。
しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。
```

### f.readline()

readline()関数を使用すると、１行ごとにファイルを読み込むことができます。

```python
path = 'text.txt'
with open(path) as f:
    l = f.readlines()
    print(l[0])
```
```:実行結果
吾輩わがはいは猫である。
```

### f.write()

write()関数を使用すると、ファイルにデータを書き込むことができます。次の例では、open()関数を使用して、text02.txtというファイルを開き（このファイルがない場合は自動的に作成します。）、文字列"テスト"というデータを書き込み、それを再度開いて、表示しています。

```python
path = 'text02.txt'

s = 'テスト'

with open(path, 'w') as f:
    f.write(s)

with open(path) as f:
    print(f.read())
```
```:実行結果
テスト
```

### json

jsonとは、「JavaScript Object Notation」の略で、JavaScript言語の表記法をベースにしたデータ形式です。jsonは以下のように、キーと数値をコロンで対にして、それをコンマで区切って、全体を{}で括って表現します。この場合、拡張子はjsonとなります。

```json:sample.json
{
 "book1":{
"title": "単位が取れる統計ノート (KS単位が取れるシリーズ)",
 "year": 2004 ,
 "price": 2592
},
"book2":{
 "title": "まずはこの一冊から 意味がわかる統計学 (BERET SCIENCE)",
 "year": 2012 ,
 "price": 2160
 },
"book3":{
 "title": "完全独習 統計学入門",
 "year": 2006 ,
 "price": 1944
}
}
```

次の例では、先ほどのjsonファイルを読み込んで、整形した状態で表示するようなプログラムを書いています。

```python
import json
f = open("sample.json", 'r')

json_data = json.load(f)
name_list = ["book1","book2","book3"]

for name in name_list:
    print("タイトル：{1}".format(name,json_data[name]["title"]),end="\t")
    print("出版年：{1}".format(name,json_data[name]["year"]),end="\t")
    print("価格：{1}".format(name,json_data[name]["price"]),end="\n")
```
```:実行結果
タイトル：単位が取れる統計ノート (KS単位が取れるシリーズ)	出版年：2004	価格：2592
タイトル：まずはこの一冊から 意味がわかる統計学 (BERET SCIENCE)	出版年：2012	価格：2160
タイトル：完全独習 統計学入門	出版年：2006	価格：1944
```