2016-03-20 11 views
27

Próbuję przeczytać "plik.txt" i umieścić zawartość w zmiennej za pomocą Golanga. Oto co próbowałem ...Golang: Jak odczytać plik tekstowy?

package main 

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

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

    fmt.Print(file) 
} 

Plik zostanie prawidłowo odczytany i powrót z os.Open zwraca typ * os.File

+2

Efektem powyższej funkcji wyjść i {0xc082016240} – Acidic

+2

Możliwy duplikat [Jak można odczytać cały plik do zmiennej łańcuchowej w golang?] (Http://stackoverflow.com/questions/13514184/ how-can-i-read-a-whole-file-into-a-string-variable-in-golang) –

Odpowiedz

50

Ty tylko potrzebujesz pakietu .

Jeśli chcesz tylko zawartość jako string, to prostym rozwiązaniem jest użycie funkcji ReadFile z pakietu . Ta funkcja zwraca plaster z bytes, który można łatwo przekonwertować na 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

To zależy od tego, co próbują to zrobić.

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

Powodem wyprowadza & {0xc082016240}, dlatego drukowania wartość wskaźnika pliku deskryptora-(*os.File), a nie plików zawartości. Aby uzyskać treść pliku, możesz READ z deskryptora pliku.


Aby przeczytać całą zawartość pliku (w bajtach) do pamięci, 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) 
} 

Ale czasami, jeśli rozmiar pliku jest duży, może to być więcej pamięci efektywne po prostu czytać na wyrywki: bufor wielkości, stąd można użyć realizację io.Reader.Read z *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 
     } 
    } 

} 

w przeciwnym razie, można również skorzystać z pakietu norma util: bufio, spróbuj Scanner. A Scanner odczytuje twój plik w tokenach: separator.

Domyślnie skaner przesuwa token o znak nowej linii (oczywiście możesz dostosować skaner, aby skanował plik, dowiedz się stąd the bufio test).

Na koniec chciałbym również odnieść się do tej niesamowitej strony: go-lang file cheatsheet. Obejmował on prawie wszystko, co dotyczyło pracy z plikami w języku go-lang, mam nadzieję, że okaże się przydatny.

+1

Tęsknię za zaimportowanym 'bufio' i powinno być' bufio.NewScanner (file) 'zamiast' bufio .NewScanner (fd) ', a z drugiej strony działa idealnie! Dziękuję Ci. –

+0

@CristianChaparroA. Zostało to naprawione! Dziękuję Ci :) – Roylee