---
# System prepended metadata

title: 複数ファイルを処理する

---

# 複数ファイルを処理する
## 準備（ファイルの確認）


```python
!cat lowercase.py
```

```python
# Make the contents of the given file lowercase and output to standard output

import sys

# Error handling
if not sys.argv[1]:
    raise 'Not enough command line arguments'

input_file = sys.argv[1]
with open(input_file) as f:
    for line in f:
        print(line.strip().lower())
```


```python
!cat sentences1.txt
```

    How have you been ?
    Pretty good .



```python
!cat sentences2.txt
```

    I have a pen .
    We are happy .


## 普通に一つずつファイルを処理する

### 標準出力


```python
# lowercase.py (lowercaseにするpythonスクリプト) で sentences1.txt をlowercase化
# 単に print() で出力していて、下に表示される。これが標準出力
!python lowercase.py sentences1.txt
```

    how have you been ?
    pretty good .


### 標準出力のリダイレクト


```python
# 標準出力は > を使うことで別ファイルに"リダイレクト"することができる
# これで out.txt というファイルが新しく生成され（あるいは上書きされ）、標準出力が書き込まれる
!python lowercase.py sentences1.txt > out.txt
```


```python
# cat で出力されたファイルの中身を確認
!cat out.txt
```

    how have you been ?
    pretty good .



```python
# out.txt を削除しておく
!rm out.txt
```

## ループ処理によって複数のファイルを処理する

### ループ処理


```python
# .txtで終わるファイル名を列挙
!for f in *.txt; do echo $f; done
```

    sentences1.txt
    sentences2.txt


#### ★説明

```
for f in *.txt; do echo $f; done
```

は

```
for f in *.txt; do
echo $f
done
```

と同様。

`*` が正規表現で言う `.*` と同じ意味。ワイルドカード。  
一時変数 `f` に `なんとか.txt` が入り、それぞれに対して echo （文字列をそのまま返す）している。

### ループ処理でpythonスクリプトを動かす


```python
# ${f%.txt} で、変数 f の内、末尾の .txt を除く部分を取ってきて、.lower を追加している
# なんとか.txt をlowercaseにしたものを なんとか.lower というファイルに出力
!for f in *.txt; do python lowercase.py $f > ${f%.txt}.lower; done
```


```python
# 新しく作成されたファイルの確認
!echo --sentences1.lower--
!cat sentences1.lower

!echo --sentences2.lower--
!cat sentences2.lower
```

    --sentences1.lower--
    how have you been ?
    pretty good .
    --sentences2.lower--
    i have a pen .
    we are happy .

