Golang: 读取文件并统计内容
上次我们从命令行接收用户输入,并统计了每次输入内容出现的次数,今天对程序加以改造,使其能够读取文件内容,并统计每行文本出现的次数。
首先,我们把接收输入的逻辑封装成一个函数:
// scan.go
package main
import (
"os"
"fmt"
"bufio"
)
func main() {
counts := make(map[string]int)
fmt.Printf("Please type in something:\n")
countLines(os.Stdin, counts)
for line, n := range counts {
fmt.Printf("%d : %s\n", n, line)
}
}
// 统计行数
func countLines(file *os.File, counts map[string]int) {
input := bufio.NewScanner(file)
for input.Scan() {
line := input.Text()
if line == "bye" {
break
}
counts[line]++
}
}
上面的 coutLines() 函数有两个参数:file *os.File 和 counts map[string]int,第一个参数可以接收标准输入或文件对象,第二个参数接收一个 map 引用。
然后,我们移除接收命令行输入的逻辑,替换为读取当前目录下的 test.txt 文件:
// scan.go
package main
import (
"os"
"fmt"
"bufio"
)
func main() {
counts := make(map[string]int)
// 打开文件
file, err := os.Open("test.txt")
// 异常处理
if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
return
}
countLines(file, counts)
// 关闭文件
file.Close()
for line, n := range counts {
fmt.Printf("%d : %s\n", n, line)
}
}
// 统计行数
func countLines(file *os.File, counts map[string]int) {
input := bufio.NewScanner(file)
for input.Scan() {
counts[input.Text()]++
}
}
我们使用 os.Open 打开 test.txt 文件,如果出现异常,则进行异常处理,如果读取成功,则统计内容,最后关闭文件。
test.txt 文件内容如下:
hello
world
hello
下面是程序的运行结果:
$ go run scan.go
# 输出内容
2 : hello
1 : world
除上述方式之外,我们还可以使用 io/ioutil 中的方法来读取文件,然后以换行符分割进行统计,实现代码如下:
// split.go
package main
import (
"os"
"fmt"
"strings"
"io/ioutil"
)
func main() {
counts := make(map[string]int)
// 读取文件
data, err := ioutil.ReadFile("test.txt")
// 异常处理
if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
return
}
// 将数据转换为字符串 然后以换行符分割
lines := strings.Split(string(data), "\n")
for _, line := range lines {
counts[line]++
}
for line, n := range counts {
fmt.Printf("%d : %s\n", n, line)
}
}
Golang: 读取文件并统计内容的更多相关文章
- Python读取文件编码及内容
Python读取文件编码及内容 最近做一个项目,需要读取文件内容,但是文件的编码方式有可能都不一样.有的使用GBK,有的使用UTF8.所以在不正确读取的时候会出现如下错误: UnicodeDecode ...
- python读取文件指定行内容
python读取文件指定行内容 import linecache text=linecache.getline(r'C:\Users\Administrator\Desktop\SourceCodeo ...
- Objective-C:随机的读取文件中的内容
可以通过改变当前文件的偏移量来实现文件的读取 -offsetInFile获取文件当前的位移量 -seekToFileOffset:(NSUInteger)length设置文件当前的位移量 -readD ...
- 在java中读取文件中的内容
package shi; import java.io.*; public class wenjianIO { public static void main(String agrs[]){ File ...
- Python 读取文件下所有内容、获取文件名、截取字符、写回文件
# coding=gbk import os import os.path #读取目录下的所有文件,包括嵌套的文件夹 def GetFileList(dir, fileList): newDir ...
- Java 多线程读取文件并统计词频 实例 出神入化的《ThreadPoolExecutor》
重在展示多线程ThreadPoolExecutor的使用,和线程同步器CountDownLatch,以及相关CAS的原子操作和线程安全的Map/队列. ThreadPool主线程 1 import j ...
- iOS案例:读取指定txt文件,并把文件中的内容输出出来
用到的是NSString中的initWithContentsOfFile: encoding方法 // // main.m // 读取指定文件并输出内容 // // Created by Apple ...
- Python读取文件内容与存储
Python读取与存储文件内容 一..csv文件 读取: import pandas as pd souce_data = pd.read_csv(File_Path) 其中File_path是文件的 ...
- PHP读取文件内容的方法
下面我们就为大家详细介绍PHP读取文件内容的两种方法. 第一种方法:fread函数 <?php $file=fopen('1.txt','rb+'); echo fread($file,file ...
随机推荐
- Pandas | 27 注意事项&窍门
警告和疑难意味着一个看不见的问题.在使用Pandas过程中,需要特别注意的地方. 与Pandas一起使用If/Truth语句 当尝试将某些东西转换成布尔值时,Pandas遵循了一个错误的惯例. 这种情 ...
- 关于System.InvalidOperationException异常
什么是InvalidOperationException 操作无效异常.当方法调用对对象的当前状态无效时引发的异常. 继承 Object Exception SystemException Inval ...
- 触发bfc解决父子元素嵌套垂直方向margin塌陷问题
首先看一下问题案例 .wrapper{ width: 100px; height: 100px; background-colo ...
- ACT开发初步(一)
ACT的全称是Application Customization Toolkit,是面向ANSYS系列产品的统一的二次开发平台.利用基于Python的API(Application Programmi ...
- java web开发入门一(servlet和jsp)基于eclispe
servlet 用java语言开发动态资源网站的技术,在doGet方法中拼接显示html,在doPost方法中提交数据.类似于.net的ashx技术. servlet生成的class文件存放在tomc ...
- 每日一问:Android 中内存泄漏都有哪些注意点?
内存泄漏对每一位 Android 开发一定是司空见惯,大家或多或少都肯定有些许接触.大家都知道,每一个手机都有一定的承载上限,多处的内存泄漏堆积一定会堆积如山,最终出现内存爆炸 OOM. 而这,也是极 ...
- 基于ELK 7.50搭建elastalert 监控报警和权限控制
ELK+监控报警全步骤 需求: 公司要求对出在windows服务器上的日志进行日志分析并根据关键字进行报警,并配置kibana权限控制.下面为详细步骤 环境: centos 7.6 elk版本7.50 ...
- Haskell-chp01
-- 函数名首字母必须小写,可以包含 '来表示该函数严格求值版本(与惰性求值相对) doubleMe x = x + x doubleUs x y = doubleMe x + doubleMe y ...
- 转载:Linux命令行快捷键
常用 Ctrl + 左右键:在单词之间跳转 Ctrl + A:跳到本行的行首 Ctrl + E:跳到页尾 Ctrl + U:删除当前光标前面的所有文字(还有剪切功能) Ctrl + K:删除当前光标后 ...
- QT攻略——我在QT中遇到的那些坑
(1)QUdpSocket接收数据 进入槽后,要用这种方式读取,否则可能会导致不发readyRead()信号 .while(udpSocket->bytesAvailable()){ udpSo ...