Jako język programowania Go ma wiele wbudowanych funkcji, w tym możliwość tworzenia, odczytywania i zapisywania plików, takich jak pliki tekstowe (.txt).

Pliki są ważnymi składnikami naszego codziennego życia we współczesnym świecie. Pliki tekstowe są przydatne do przechowywania ustrukturyzowanych danych czytelnych dla człowieka bez użycia zewnętrznego oprogramowania lub baz danych.

Jeśli zastanawiasz się, jak zacząć manipulować plikami tekstowymi w Go, ten artykuł jest dla Ciebie odpowiednim miejscem.

Pakiet bufio w Go

The bufio pakiet, który jest częścią standardowej biblioteki Go, jest używany do buforowanych operacji wejścia i wyjścia, stąd nazwa. The bufio pakiet opiera się na ja. Czytelnik I ja. Pisarz interfejsy, które są szeroko stosowane w implementacji większości standardowych pakietów Go.

The bufio pakiet idzie o krok dalej, implementując buforowanie, co czyni go użytecznym dla operacji IO obejmujących dane tekstowe.

Aby użyć bufio pakiet w swoim programie, powinieneś zaimportować go razem z innymi pakietami.

instagram viewer
import (
"fmt"
"bufio"
)

Prawdopodobnie słyszałeś, kiedy zaczął od Go że zawiera wszystko, czego możesz potrzebować jako programista. Do bezpośredniej komunikacji z systemem operacyjnym służy pakiet o nazwie os który zapewnia funkcje niezależne od platformy.

The os I bufio pakiety sprawiają, że manipulowanie plikami tekstowymi jest niezwykle proste.

Choć zdecydowana większość os Funkcje pakietu są podobne do uniksowych, wszystkie wykorzystują styl obsługi błędów Go, co ułatwia odczytywanie komunikatów o błędach i debugowanie kodu.

Jak więc manipulować plikami zawierającymi tekst w Go?

Jak odczytywać dane z pliku tekstowego

Aby odczytać dane z plików tekstowych, należy wywołać metodę os paczka Otwarty() funkcja, która jako parametr przyjmuje nazwę pliku do odczytania. Inną metodą uzyskania pliku jest użycie Otwórz plik() funkcjonować.

Główna różnica między Otwarty() I Otwórz plik() jest w ich realizacji. Otwarty() otwiera plik w trybie tylko do odczytu (z rozszerzeniem TYLKO O_RD flaga), natomiast Otwórz plik() daje większą elastyczność, akceptując trzy parametry, a mianowicie:

  • Nazwa pliku
  • Tryb otwierania pliku: Prawidłowe tryby otwierania pliku są pokazane w poniższej tabeli.
    Flaga Oznaczający
    TYLKO O_RD Otwiera plik w trybie tylko do odczytu
    O_WRONLY Otwiera plik w trybie tylko do zapisu
    O_RDWR Otwiera plik w trybie odczytu i zapisu
    O_APPEND Dołącza dane do pliku podczas zapisywania
    O_CREATE Tworzy nowy plik, jeśli żaden nie istnieje
    O_EXCL Używany z O_CREATE, aby wskazać, że plik powinien zostać utworzony tylko wtedy, gdy nie istnieje
    O_SYNC Otwiera plik dla synchronicznych operacji we/wy
    O_TRUNC Obetnij plik przy otwieraniu, jeśli to możliwe
  • Uprawnienia do plików: takie same jak bity uprawnień do plików w systemie Linux używany do określania reguł dostępu do plików, np. 0777 do nadawania uprawnień do odczytu, zapisu i wykonywania wszystkim typom użytkowników.

Poniższy kod pokazuje, jak odczytać dane z pliku tekstowego w Go za pomocą os. Otwarty(), I Skanowanie() który w tym przypadku przebiega w a Idź na pętlę.

pakiet główny
import (
"bufio"
"fmt"
"dziennik"
"os"
)
/**
TREŚĆ "plik testowy.txt" plik.
Lorem ipsum dolor sit amet
LOREM IPSUM DOLOR SIT AMET
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet
*/
funkcja główny(){
plik, błąd := os. Otwarty("plik testowy.txt")
// inna metoda wykorzystująca os. Otwórz plik()
// plik, błąd = os. Otwórz plik("plik testowy.txt", os. O_RDONLY, 0644)
jeśli błąd!= zero {
dziennik.Fatalny(błądzić)
}
odraczaćplik.Zamknąć()
fmt. println("Plik został pomyślnie otwarty. Teraz odczytywanie zawartości pliku wiersz po wierszu:")
// tworzyć skaner z the plikDoCzytaćtekstz
skaner := bufio. NowySkaner (plik)
// zeskanuj lub przeczytaj bajty tekstu wiersz po wierszu
Doskaner.Skanowanie() {
fmt.Drukuj ln(skaner.Tekst())
}
jeśli błąd: = skaner. Błądzić(); błąd!= zero {
dziennik.Fatalny(błądzić)
}
}

Kiedy uruchomisz powyższy kod za pomocą idź uruchom plik nazwa.go, generuje dane wyjściowe pokazane poniżej:

Jeśli podasz tylko nazwę pliku, a nie ścieżkę do pliku Otwarty() Lub Otwórz plik() dla operacji odczytu, Go zakłada, że ​​plik znajduje się w bieżącym katalogu i zwraca błąd, jeśli go nie znajdzie. Powinieneś podać ścieżkę do pliku, jeśli chcesz pracować z plikami poza bieżącym katalogiem.

Jak zapisać dane do pliku tekstowego

The bufio pakiet zapewnia buforowanie Pisarz interfejs, który przechowuje bajty danych i zapisuje je do pliku za pomocą a Spłukać() funkcjonować.

Następny przykładowy kod jest kontynuacją kodu do odczytu pliku. W tym przykładzie dane są zapisywane do istniejącego plik testowy.txt używając O_WRONLY I O_APPEND flagi.

Dodaj następujące wiersze kodu do powyższego programu, przed zamykającym nawiasem klamrowym elementu główny() funkcjonować:

// zapis danych wyjściowych do pliku
plik, błąd = os. OpenFile("testfile.txt", os. O_APPEND|os. O_WRONLY, 0644)
Jeśli błąd!= zero {
dziennik. Fatalny (błąd)
}
odraczać plik. Zamknąć()
fmt. Println("Plik został pomyślnie otwarty, teraz przygotowuje się do zapisu danych do pliku...")
// utwórz buforowany obiekt Writer, aby zapisać dane do pliku
textWriter := bufio. NewWriter (plik)
// zapisz string do bufora przed zapisaniem pliku.
_, błąd = autor tekstu. WriteString("-To jest a nowy tekst dodany do pliku.")
Jeśli błąd!= zero {
dziennik. Fatalny (błąd)
}
autor tekstów. Spłukać()
fmt. Println("Dane zostały pomyślnie zapisane do pliku...")

Wyjście całego programu powinno wyglądać tak:

Kiedy otworzysz plik testowy.txt plik, zobaczysz również nową linię dodaną na końcu pliku, tak jak na poniższym obrazku:

Obsługa plików w Go jest łatwa

Go umożliwia pracę z różnymi plikami, nie tylko plikami tekstowymi. Istnieje wiele dodatkowych wbudowanych bibliotek i funkcji do pracy z różnymi typami danych z plików, w tym JSON i CSV.

Aby zobaczyć, jak zachowują się różnie w zależności od sytuacji, możesz poeksperymentować z różnymi flagami i uprawnieniami do plików, które są dostępne do użytku z Otwórz plik().