Go文件读取:os.ReadFile与bufio.Scanner详解
<|begin▁of▁sentence|>---
title: "Golang でファイルを読み込む (os.ReadFile, os.Open, bufio.Scanner)"
linkTitle: "ファイルを読み込む (os.ReadFile, os.Open, bufio.Scanner)"
url: "p/5qo6x5a/"
date: "2022-09-09"
tags: ["Go"]
---
ファイル全体を一度に読み込む (os.ReadFile)
----
Go 1.16 で追加された [os.ReadFile 関数](https://pkg.go.dev/os#ReadFile) を使うと、ファイル全体を一度に読み込むことができます。
ファイルサイズが大きい場合は効率が悪くなりますが、小さなファイルを読み込むときはシンプルで分かりやすいです。
{{< code lang="go" title="main.go" >}}
package main
import (
"fmt"
"log"
"os"
)
func main() {
data, err := os.ReadFile("input.txt")
if err != nil {
log.Fatal(err)
}
fmt.Print(string(data))
}
{{< /code >}}
{{< code lang="txt" title="実行結果" >}}
Hello
World
{{< /code >}}
`os.ReadFile` 関数はファイルの内容を `[]byte` スライスとして返すので、文字列として扱いたい場合は `string(data)` のように変換する必要があります。
ファイルが存在しない場合などは `err` が非 nil になるので、エラーチェックを忘れないようにします。
ファイルを開いて少しずつ読み込む (os.Open + bufio.Scanner)
----
サイズの大きいファイルを読み込む場合は、ファイルを開いて (`os.Open`) 少しずつ読み込んでいくのが効率的です。
次の例では、[bufio.Scanner](https://pkg.go.dev/bufio#Scanner) を使ってテキストファイルを 1 行ずつ読み込んでいます。
{{< code lang="go" title="main.go" >}}
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("input.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
{{< /code >}}
{{< code lang="txt" title="実行結果" >}}
Hello
World
{{< /code >}}
`os.Open` 関数でファイルを開き、関数を抜けるときに確実にファイルを閉じるために `defer file.Close()` を実行します。
`bufio.Scanner` は、デフォルトで 1 行ずつ読み込むように設定されているので、`for` ループと組み合わせることで行単位の処理を行えます。
`Scanner` が EOF に達すると `for` ループを抜けますが、その他の要因(ファイルが途中で読めなくなったなど)でエラーが発生した場合は、`scanner.Err()` でエラー内容を確認できます。
`bufio.Scanner` はデフォルトで 1 行ずつ読み込みますが、`Scanner#Split` メソッドで分割関数を変更することで、単語単位で読み込むこともできます。
```go
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords) // 単語単位で読み込む
for scanner.Scan() {
fmt.Println(scanner.Text())
}
```
その他の分割関数として、`bufio.ScanBytes` (バイト単位)、`bufio.ScanRunes` (ルーン単位) などがあります。
最新文章
- 汽车四轮定位全解析:前束角与外倾角调整指南
- 驾驶体验电子稳定程序提升汽车安全性能
- 汽车碰撞保险理赔流程详解
- 行车安全必备:三角警示牌与制动系统的关键作用
- 滚动阻力对汽车油耗影响
- 汽车四轮定位全解析:悬架系统调整与轮胎保养指南
- 智能汽车三大核心传感器:毫米波雷达、激光雷达与超声波技术解析
- 汽车与未来出行的绿色革命
- 定期检查机油更换轮胎保养发动机
- 提升汽车动力的三大关键:进气、燃烧与排气效率优化
- 汽车安全气囊系统保护乘客安全
- 电瓶车限高限重如何影响汽车行驶安全?
- 智能传感器如何优化汽车悬挂系统的性能表现
- 未来出行革命:新能源、自动驾驶与车联网重塑汽车产业
- 车联网与智能驾驶:V2X技术如何重塑未来出行
- 电动汽车与智能驾驶:未来出行的绿色革命
- 智能LED驱动技术引领汽车照明革命与安全升级
- 智能网联与新能源:V2X、固态电池和MaaS重塑未来出行
- 电动化浪潮下:电池技术突破与车联网生态发展
- 汽车湿度传感器故障诊断与维修保养全指南
