2016-03-20 17 views
27

Tôi đang cố gắng đọc "file.txt" và đưa nội dung vào một biến bằng cách sử dụng Golang. Dưới đây là những gì tôi đã cố gắng ...Golang: Cách đọc một tập tin văn bản?

package main 

import (
    "fmt" 
    "os" 
    "log" 
) 

func main() { 
    file, err := os.Open("file.txt") 
    if err != nil { 
     log.Fatal(err) 
    } 

    fmt.Print(file) 
} 

Các tập tin được đọc thành công và sự trở lại từ os.Open trả về một loại * os.File

+2

Kết quả của hàm trên kết quả đầu ra & {} 0xc082016240 – Acidic

+2

có thể trùng lặp của [Làm thế nào tôi có thể đọc một tập tin toàn bộ vào một biến chuỗi trong golang?] (Http://stackoverflow.com/questions/13514184/ how-can-i-read-a-whole-file-in-a-string-biến-trong-golang) –

Trả lời

50

Bạn chỉ cần gói io/ioutil.

Nếu bạn chỉ muốn nội dung là string, thì giải pháp đơn giản là sử dụng hàm ReadFile từ gói io/ioutil. Hàm này trả về một lát của bytes mà bạn có thể dễ dàng chuyển đổi thành string.

package main 

import (
    "fmt" 
    "io/ioutil" 
) 

func main() { 
    b, err := ioutil.ReadFile("file.txt") // just pass the file name 
    if err != nil { 
     fmt.Print(err) 
    } 

    fmt.Println(b) // print the content as 'bytes' 

    str := string(b) // convert content to a 'string' 

    fmt.Println(str) // print the content as a 'string' 
} 
19

Nó phụ thuộc vào những gì bạn đang cố gắng làm.

file, err := os.Open("file.txt") 
fmt.print(file) 

Lý do nó ra & {0xc082016240}, là bởi vì bạn đang in giá trị con trỏ của một tập tin mô tả (*os.File), không nộp-nội dung. Để lấy nội dung tệp, bạn có thể READ từ bộ mô tả tệp.


Để đọc toàn bộ nội dung tập tin (theo byte) vào bộ nhớ, ioutil.ReadAll

package main 

import (
    "fmt" 
    "os" 
    "log" 
) 

func main() { 
    file, err := os.Open("file.txt") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer file.Close() 


    b, err := ioutil.ReadAll(file) 
    fmt.Print(b) 
} 

Nhưng đôi khi, nếu kích thước tập tin là lớn, nó có thể là nhiều bộ nhớ hiệu quả để chỉ cần đọc trong khối: đệm kích thước, do đó bạn có thể sử dụng thi hành io.Reader.Read từ *os.File

func main() { 
    file, err := os.Open("file.txt") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer file.Close() 


    buf := make([]byte, 32*1024) // define your buffer size here. 

    for { 
     n, err := file.Read(buf) 

     if n > 0 { 
      fmt.Print(buf[:n]) // your read buffer. 
     } 

     if err == io.EOF { 
      break 
     } 
     if err != nil { 
      log.Printf("read %d bytes: %v", n, err) 
      break 
     } 
    } 

} 

Nếu không, bạn cũng có thể sử dụng gói tiêu chuẩn util: bufio, hãy thử Scanner. A Scanner đọc tệp của bạn trong mã thông báo: dấu phân cách.

Theo mặc định, máy quét tiến hành mã thông báo bằng dòng mới (tất nhiên bạn có thể tùy chỉnh cách máy quét mã hóa tệp của bạn, tìm hiểu từ đây the bufio test).

package main 

import (
    "fmt" 
    "os" 
    "log" 
    "bufio" 
) 

func main() { 
    file, err := os.Open("file.txt") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer file.Close() 

    scanner := bufio.NewScanner(file) 

    for scanner.Scan() {    // internally, it advances token based on sperator 
     fmt.Println(scanner.Text()) // token in unicode-char 
     fmt.Println(scanner.Bytes()) // token in bytes 

    } 
} 

Cuối cùng, tôi cũng muốn giới thiệu bạn đến trang web tuyệt vời này: go-lang file cheatsheet. Nó bao gồm khá nhiều thứ liên quan đến việc làm việc với các tệp tin trong go-lang, hy vọng bạn sẽ thấy nó hữu ích.

+1

bạn bỏ lỡ lệnh nhập 'bufio' và nó phải là' bufio.NewScanner (file) 'thay vì' bufio .NewScanner (fd) ', và mặt khác, nó hoạt động hoàn hảo !! cảm ơn bạn. –

+0

@CristianChaparroA. Nó đã được sửa! cảm ơn bạn :) – Roylee

Các vấn đề liên quan