常见文件格式处理
文件格式是文件数据组织和表示的方式,不同的文件格式适用于不同的应用场景。本章将介绍常见的文件格式及其处理方法,包括文本文件、二进制文件、XML、JSON、CSV 和 TSV 文件等。
8.1 文本文件格式
文本文件是以纯文本形式存储数据的文件,常用于存储配置文件、日志文件和简单的数据文件。
Go 示例代码(读取和写入文本文件):
package main
import (
"bufio"
"fmt"
"os"
)
func writeTextFile(filePath string, content string) {
file, err := os.Create(filePath)
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
_, err = writer.WriteString(content)
if err != nil {
fmt.Println("Error writing to file:", err)
return
}
writer.Flush()
}
func readTextFile(filePath string) {
file, err := os.Open(filePath)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Println("Error reading file:", err)
}
}
func main() {
filePath := "example.txt"
content := "Hello, world!\nThis is a text file."
writeTextFile(filePath, content)
readTextFile(filePath)
}
8.2 二进制文件格式
二进制文件是以二进制形式存储数据的文件,常用于存储结构化数据和需要高效读取的文件。
Go 示例代码(读取和写入二进制文件):
package main
import (
"encoding/binary"
"fmt"
"os"
)
func writeBinaryFile(filePath string, data []int32) {
file, err := os.Create(filePath)
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
for _, value := range data {
err = binary.Write(file, binary.LittleEndian, value)
if err != nil {
fmt.Println("Error writing to file:", err)
return
}
}
}
func readBinaryFile(filePath string) {
file, err := os.Open(filePath)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
var value int32
for {
err = binary.Read(file, binary.LittleEndian, &value)
if err != nil {
break
}
fmt.Println(value)
}
if err != nil && err.Error() != "EOF" {
fmt.Println("Error reading file:", err)
}
}
func main() {
filePath := "example.bin"
data := []int32{1, 2, 3, 4, 5}
writeBinaryFile(filePath, data)
readBinaryFile(filePath)
}
8.3 XML 与 JSON 文件
XML 和 JSON 是常见的用于数据交换和配置的文件格式。
Go 示例代码(处理 JSON 文件):
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func writeJSONFile(filePath string, person Person) {
file, err := os.Create(filePath)
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
encoder := json.NewEncoder(file)
err = encoder.Encode(person)
if err != nil {
fmt.Println("Error encoding JSON to file:", err)
}
}
func readJSONFile(filePath string) {
file, err := os.Open(filePath)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
var person Person
decoder := json.NewDecoder(file)
err = decoder.Decode(&person)
if err != nil {
fmt.Println("Error decoding JSON from file:", err)
return
}
fmt.Printf("Name: %s, Age: %d\n", person.Name, person.Age)
}
func main() {
filePath := "person.json"
person := Person{Name: "Alice", Age: 30}
writeJSONFile(filePath, person)
readJSONFile(filePath)
}
Go 示例代码(处理 XML 文件):
package main
import (
"encoding/xml"
"fmt"
"os"
)
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
}
func writeXMLFile(filePath string, person Person) {
file, err := os.Create(filePath)
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
encoder := xml.NewEncoder(file)
encoder.Indent("", " ")
err = encoder.Encode(person)
if err != nil {
fmt.Println("Error encoding XML to file:", err)
}
}
func readXMLFile(filePath string) {
file, err := os.Open(filePath)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
var person Person
decoder := xml.NewDecoder(file)
err = decoder.Decode(&person)
if err != nil {
fmt.Println("Error decoding XML from file:", err)
return
}
fmt.Printf("Name: %s, Age: %d\n", person.Name, person.Age)
}
func main() {
filePath := "person.xml"
person := Person{Name: "Alice", Age: 30}
writeXMLFile(filePath, person)
readXMLFile(filePath)
}
8.4 CSV 与 TSV 文件
CSV(Comma-Separated Values)和 TSV(Tab-Separated Values)文件是常用于存储表格数据的文件格式。
Go 示例代码(处理 CSV 文件):
package main
import (
"encoding/csv"
"fmt"
"os"
)
func writeCSVFile(filePath string, records [][]string) {
file, err := os.Create(filePath)
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
writer := csv.NewWriter(file)
err = writer.WriteAll(records)
if err != nil {
fmt.Println("Error writing to CSV file:", err)
}
}
func readCSVFile(filePath string) {
file, err := os.Open(filePath)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
reader := csv.NewReader(file)
records, err := reader.ReadAll()
if err != nil {
fmt.Println("Error reading from CSV file:", err)
return
}
for _, record := range records {
fmt.Println(record)
}
}
func main() {
filePath := "example.csv"
records := [][]string{
{"Name", "Age"},
{"Alice", "30"},
{"Bob", "25"},
}
writeCSVFile(filePath, records)
readCSVFile(filePath)
}
通过学习本章内容,读者将能够掌握常见文件格式的处理方法,包括文本文件、二进制文件、XML、JSON、CSV 和 TSV 文件的读写操作,从而在实际开发中灵活应用这些知识。