Golang如何持续追加数据到文本文件而不覆盖原有内容
Golang如何持续追加数据到文本文件而不覆盖原有内容
nf, err := os.Create("results.txt")
if err != nil {
panic(err)
}
defer func() {
err := nf.Close()
if err != nil {
panic(err)
}
}()
timeOfUpdate := time.Now()
_, err = fmt.Fprintf(nf, "File last time updated - %v\n", timeOfUpdate.Format("2006.01.02 15:04:05"))
if err != nil {
panic(err)
}
length := len(results)
_, err = fmt.Fprintf(nf, "Reisai without GPS - %v\n", length)
if err != nil {
panic(err)
}
for key, value := range results {
_, err := fmt.Fprintf(nf, "Bus number: %v\n Full bus info: %v\n", key, value)
if err != nil {
panic(err)
}
nf.Sync()
}
我正在使用这样的代码将数据打印到文件中,我希望能够持续向文件添加数据,而不是每次都重写文件。
我认为问题在于每次启动这个 KingPing 用例时都会创建文件
nf, err := os.Create("results.txt")
if err != nil {
panic(err)
}
defer func() {
err := nf.Close()
if err != nil {
panic(err)
}
}()
我的完整 KingPin 用例:
case results.FullCommand():
rp := reisai.NewReisaiParser(&reisai.ReisaiParserOpts{MinutesSinceMidnight: mins.GetMinutesSinceMidnight()})
reisai1, err := rp.ParseDefaultReisai()
if err != nil {
panic(err)
}
ep := gps.NewGpsParser(&gps.GpsParserOpts{})
gps1, err := ep.ParseDefaultGps()
if err != nil {
panic(err)
}
analysis.Analyze(gps1, reisai1)
results := make(map[string]*reisai.ReisaiDataRow)
for NewMap, reisai := range reisai1 {
results[NewMap] = reisai
}
nf, err := os.Create("results.txt")
if err != nil {
panic(err)
}
defer func() {
err := nf.Close()
if err != nil {
panic(err)
}
}()
timeOfUpdate := time.Now()
_, err = fmt.Fprintf(nf, "File last time updated - %v\n", timeOfUpdate.Format("2006.01.02 15:04:05"))
if err != nil {
panic(err)
}
length := len(results)
_, err = fmt.Fprintf(nf, "Reisai without GPS - %v\n", length)
if err != nil {
panic(err)
}
for key, value := range results {
_, err := fmt.Fprintf(nf, "Bus number: %v\n Full bus info: %v\n", key, value)
if err != nil {
panic(err)
}
nf.Sync()
}
fmt.Println("List of not working GPS systems has been updated and saved into file results.txt")
}
更多关于Golang如何持续追加数据到文本文件而不覆盖原有内容的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
MantasSilanskas:
nf, err := os.Create(“results.txt”)
使用追加或创建权限打开文件。示例:
f, err := os.OpenFile("file.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
您的问题确实在于使用了 os.Create(),这个函数会在文件存在时截断文件内容。要实现追加写入,需要使用 os.OpenFile() 并设置正确的标志。
以下是修改后的代码:
// 替换 os.Create() 为以下代码
nf, err := os.OpenFile("results.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
panic(err)
}
defer func() {
err := nf.Close()
if err != nil {
panic(err)
}
}()
完整的修改后代码示例:
case results.FullCommand():
rp := reisai.NewReisaiParser(&reisai.ReisaiParserOpts{MinutesSinceMidnight: mins.GetMinutesSinceMidnight()})
reisai1, err := rp.ParseDefaultReisai()
if err != nil {
panic(err)
}
ep := gps.NewGpsParser(&gps.GpsParserOpts{})
gps1, err := ep.ParseDefaultGps()
if err != nil {
panic(err)
}
analysis.Analyze(gps1, reisai1)
results := make(map[string]*reisai.ReisaiDataRow)
for NewMap, reisai := range reisai1 {
results[NewMap] = reisai
}
// 使用追加模式打开文件
nf, err := os.OpenFile("results.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
panic(err)
}
defer func() {
err := nf.Close()
if err != nil {
panic(err)
}
}()
timeOfUpdate := time.Now()
_, err = fmt.Fprintf(nf, "File last time updated - %v\n", timeOfUpdate.Format("2006.01.02 15:04:05"))
if err != nil {
panic(err)
}
length := len(results)
_, err = fmt.Fprintf(nf, "Reisai without GPS - %v\n", length)
if err != nil {
panic(err)
}
for key, value := range results {
_, err := fmt.Fprintf(nf, "Bus number: %v\n Full bus info: %v\n", key, value)
if err != nil {
panic(err)
}
nf.Sync()
}
fmt.Println("List of not working GPS systems has been updated and saved into file results.txt")
}
关键修改说明:
os.O_APPEND- 在文件末尾追加数据os.O_CREATE- 如果文件不存在则创建os.O_WRONLY- 以只写模式打开文件0644- 文件权限设置
这样每次运行程序时,新的内容都会追加到文件末尾而不是覆盖原有内容。

