Go’yu kullanarak bir metin dosyasına okumak ve yazmak ister misiniz? Go programlama dilinin işletim sistemi ve bufio paketleri, metin dosyalarıyla çalışmayı basitleştirir.
Bir programlama dili olarak Go, metin (.txt) dosyaları gibi dosyalar oluşturma, okuma ve yazma dahil olmak üzere çok çeşitli yerleşik özelliklere sahiptir.
Dosyalar, modern dünyada günlük hayatımızın önemli bileşenleridir. Metin dosyaları, harici yazılım veya veritabanları kullanmadan yapılandırılmış, insan tarafından okunabilen verileri depolamak için kullanışlıdır.
Go’da metin dosyalarını değiştirmeye nasıl başlayabileceğinizi merak ediyorsanız, bu makale tam size göre.
Go’daki bufio Paketi
Go’nun standart kitaplığının bir parçası olan bufio paketi, arabelleğe alınmış giriş ve çıkış işlemleri için kullanılır, dolayısıyla adı. Bufio paketi, Go’nun standart paketlerinin çoğunun uygulanmasında yaygın olarak kullanılan io.Reader ve io.Writer arayüzleri üzerine kuruludur.
Bufio paketi, arabelleğe alma uygulayarak bir adım daha ileri giderek, onu metinsel verileri içeren IO işlemleri için kullanışlı hale getirir.
Bufio paketini programınızda kullanmak için diğer paketlerle birlikte içe aktarmalısınız.
import (
“fmt”
“bufio”
)
Go’yu kullanmaya başladığınızda muhtemelen bir programcı olarak ihtiyaç duyabileceğiniz her şeyi içerdiğini duymuşsunuzdur . İşletim sisteminizle doğrudan iletişim için platformdan bağımsız işlevler sağlayan os adlı bir paket bulunmaktadır.
İşletim sistemi ve bufio paketleri, metin dosyası işlemeyi inanılmaz derecede basit hale getirir.
İşletim sistemi paketinin işlevlerinin büyük çoğunluğu Unix benzeri olsa da, hepsi hata mesajlarını okumayı ve kod ayıklamayı kolaylaştıran Go hata işleme stilini kullanır.
Peki, Go’da metin içeren dosyaları nasıl değiştirirsiniz?
Bir Metin Dosyasından Veri Nasıl Okunur
Metin dosyalarından veri okumak için, os paketinin, okunacak dosyanın adını parametre olarak kabul eden Open() işlevini çağırmanız gerekir. Dosyayı almanın başka bir yöntemi de OpenFile() işlevini kullanmaktır.
Open() ve OpenFile() arasındaki en büyük fark bunların uygulanmasındadır. Open() bir dosyayı salt okunur modda açar ( O_RDONLY bayrağıyla), OpenFile() ise üç parametreyi kabul ederek daha fazla esneklik sağlar:
Dosya adı
Dosya açma modu: Geçerli dosya açma modları aşağıdaki tabloda gösterilmektedir.
bayrak Anlam
O_RDONLY Dosyayı salt okunur modda açar
O_WRONLY Dosyayı salt yazma modunda açar
O_RDWR Dosyayı okuma-yazma modunda açar
O_APPEND Yazarken dosyaya veri ekler
O_CREATE Hiçbiri yoksa yeni bir dosya oluşturur
O_EXCL O_CREATE ile birlikte, dosyanın yalnızca mevcut değilse oluşturulması gerektiğini belirtmek için kullanılır.
O_SYNC Senkronize G/Ç için dosyayı açar
O_TRUNC Mümkünse dosyayı açarken kısaltın
Dosya izinleri: Linux’ta dosya erişim kurallarını belirlemek için kullanılan dosya izin bitleriyle aynı, örneğin 0777 tüm kullanıcı türlerine okuma, yazma ve yürütme izinleri vermek.
Aşağıdaki kod, os.Open() ve bu durumda Go for döngüsünde çalışan Scan() kullanılarak Go’daki bir metin dosyasından verilerin nasıl okunacağını gösterir.
package main
import (
“bufio”
“fmt”
“log”
“os”
)
/**
CONTENT OF THE “testfile.txt” file.
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
*/
func main() {
file, err := os.Open(“testfile.txt”)
// another method using os.OpenFile()
// file, err = os.OpenFile(“testfile.txt”, os.O_RDONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
fmt.Println(“File opened successfully. Now reading file contents line by line:”)
// create scanner from the file to read text from
scanner := bufio.NewScanner(file)
// scan or read the bytes of text line by line
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
Yukarıdaki kodu go run filename.go ile çalıştırdığınızda , aşağıda gösterilen çıktıyı üretir:
Okuma işlemleri için Open() veya OpenFile() işlevinin yolunu değil de yalnızca dosya adını iletirseniz , Go dosyanın mevcut dizinde olduğunu varsayar ve bulamazsa bir hata döndürür. Geçerli dizinin dışındaki dosyalarla çalışmanız gerekiyorsa, dosya yolunu iletmelisiniz.
Bir Metin Dosyasına Veri Nasıl Yazılır
Bufio paketi, baytlarca veriyi depolayan ve bunları bir Flush() işlevi yardımıyla bir dosyaya yazan arabelleğe alınmış bir Writer arabirimi sağlar.
Bir sonraki örnek kod, bir dosyayı okumak için kullanılanın devamıdır. Bu örnekte, veriler O_WRONLY ve O_APPEND bayrakları kullanılarak mevcut testfile.txt dosyasına yazılır.
main() fonksiyonunun kapanış küme ayracından önce yukarıdaki programa aşağıdaki kod satırlarını ekleyin :
// write output data to file
file, err = os.OpenFile(“testfile.txt”, os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
fmt.Println(“File opened successfully, Now preparing to write data to file…”)
// create buffered Writer object to write data to file
textWriter := bufio.NewWriter(file)
// write string to buffer before saving file.
_, err = textWriter.WriteString(“-This is a new text added to the file.”)
if err != nil {
log.Fatal(err)
}
textWriter.Flush()
fmt.Println(“Data written to file successfully…”)
Tam programınızın çıktısı şöyle görünmelidir:
Go’da Dosya İşleme Kolaydır
Go, yalnızca metin dosyalarıyla değil, çeşitli dosyalarla çalışmanıza olanak tanır. JSON ve CSV dahil olmak üzere dosyalardan farklı türde verilerle çalışmak için çok sayıda ek yerleşik kitaplık ve işlev vardır.
Duruma göre nasıl farklı davrandıklarını görmek için, OpenFile() ile kullanılabilen çeşitli bayrakları ve dosya izinlerini deneyebilirsiniz.