آیا می خواهید با استفاده از Go یک فایل متنی را بخوانید و بنویسید؟ بسته های os و bufio زبان برنامه نویسی Go کار با فایل های متنی را ساده می کند.
به عنوان یک زبان برنامه نویسی، Go دارای طیف گسترده ای از ویژگی های داخلی است، از جمله توانایی ایجاد، خواندن و نوشتن فایل هایی مانند فایل های متنی (txt).
فایل ها اجزای مهم زندگی روزمره ما در دنیای مدرن هستند. فایل های متنی برای ذخیره سازی داده های ساختار یافته قابل خواندن توسط انسان بدون استفاده از نرم افزارهای خارجی یا پایگاه داده مفید هستند.
اگر نمیدانید چگونه میتوانید دستکاری فایلهای متنی را در Go شروع کنید، این مقاله مکان مناسبی برای شماست.
بسته bufio in Go
بسته bufio، که بخشی از کتابخانه استاندارد Go است، برای عملیات ورودی و خروجی بافر استفاده میشود، از این رو نام آن بهدست میآید. بسته bufio بر پایه رابط های io.Reader و io.Writer است که به طور گسترده در اجرای اکثر بسته های استاندارد Go استفاده می شود.
بسته bufio با اجرای بافر یک گام جلوتر می رود و برای عملیات IO که شامل داده های متنی است مفید است.
برای استفاده از بسته bufio در برنامه خود، باید آن را در کنار بسته های دیگر وارد کنید.
import (
"fmt"
"bufio"
)
احتمالاً زمانی که با Go شروع به کار کردید شنیده اید که هر چیزی را که احتمالاً به عنوان یک برنامه نویس می توانید به آن نیاز داشته باشید به همراه دارد. برای ارتباط مستقیم با سیستم عامل شما، بسته ای به نام os وجود دارد که عملکردهای مستقل از پلتفرم را ارائه می دهد.
بسته های os و bufio دستکاری فایل های متنی را بسیار ساده می کنند.
اگرچه اکثر توابع بسته OS شبیه یونیکس هستند، اما همه آنها از سبک Go برای مدیریت خطا استفاده می کنند که خواندن پیام های خطا و کد اشکال زدایی را ساده می کند.
بنابراین، چگونه فایل های حاوی متن را در Go دستکاری می کنید؟
نحوه خواندن داده ها از یک فایل متنی
برای خواندن دادهها از فایلهای متنی، باید تابع Open() بسته os را فراخوانی کنید، که نام فایل را میپذیرد تا به عنوان پارامتر خوانده شود. روش دیگر برای دریافت فایل استفاده از تابع OpenFile() است.
تفاوت عمده بین Open() و OpenFile() در پیاده سازی آنهاست. Open() یک فایل را در حالت فقط خواندنی باز می کند (با پرچم O_RDONLY)، در حالی که OpenFile() با پذیرش سه پارامتر یعنی:
- نام فایل
- حالت باز کردن فایل: حالت های باز فایل معتبر در جدول زیر نشان داده شده است. معنی پرچم O_RDONLY فایل را در حالت فقط خواندنی باز می کند O_WRONLY فایل را در حالت فقط نوشتن باز می کند O_RDWR فایل را در حالت خواندن-نوشتن باز می کند O_APPEND هنگام نوشتن O_CREATE داده ها را به فایل اضافه می کند اگر وجود نداشته باشد فایل جدیدی ایجاد می کند O_EXCL مورد استفاده با O_CREATE، برای نشان دادن اینکه فایل فقط در صورتی باید ایجاد شود که وجود نداشته باشد O_SYNC فایل را برای I/O همزمان باز می کند O_TRUNC در صورت امکان فایل را در حالت باز کوتاه کنید
- مجوزهای فایل: مانند بیت های مجوز فایل در لینوکس که برای تعیین قوانین دسترسی به فایل استفاده می شود، به عنوان مثال، 0777 برای اعطای مجوزهای خواندن، نوشتن و اجرا به همه انواع کاربر.
پرچم
معنی
O_RDONLY
فایل را در حالت فقط خواندنی باز می کند
O_WRONLY
فایل را در حالت فقط نوشتن باز می کند
O_RDWR
فایل را در حالت خواندن و نوشتن باز می کند
O_APPEND
هنگام نوشتن داده ها را به فایل اضافه می کند
O_CREATE
اگر فایلی وجود نداشته باشد، یک فایل جدید ایجاد می کند
O_EXCL
با O_CREATE استفاده می شود، برای نشان دادن اینکه فایل فقط در صورتی باید ایجاد شود که وجود نداشته باشد
O_SYNC
فایل را برای I/O همزمان باز می کند
O_TRUNC
در صورت امکان فایل را در حالت باز کوتاه کنید
کد زیر نحوه خواندن داده ها از یک فایل متنی در Go را با استفاده از os.Open() و Scan() نشان می دهد که در این مورد در یک حلقه Go for اجرا می شود.
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)
}
}
وقتی کد بالا را با go run filename.go اجرا می کنید، خروجی زیر را تولید می کند:
اگر فقط نام فایل را بنویسید و نه مسیر را
باز کن()
یا
OpenFile()
تابع برای عملیات خواندن، Go فرض می کند که فایل در دایرکتوری حاضر است و اگر آن را پیدا نکرد، خطا را برمی گرداند. اگر نیاز به کار با فایل های خارج از دایرکتوری فعلی دارید، باید مسیر فایل را ارسال کنید.
نحوه نوشتن داده ها در یک فایل متنی
بسته bufio یک رابط Writer بافر را فراهم می کند که بایت های داده را ذخیره می کند و آنها را با کمک یک تابع Flush() در یک فایل می نویسد.
کد نمونه بعدی ادامه کدی برای خواندن یک فایل است. در این مثال، داده ها با استفاده از پرچم های O_WRONLY و O_APPEND روی testfile.txt موجود نوشته می شوند.
خطوط کد زیر را قبل از بسته شدن پرانتز تابع main() به برنامه بالا اضافه کنید:
// 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...")
خروجی برنامه کامل شما باید به شکل زیر باشد:
هنگامی که فایل testfile.txt را باز می کنید، مانند تصویر زیر، خط جدیدی را نیز خواهید دید که در انتهای فایل اضافه شده است:
مدیریت فایل در Go آسان است
Go به شما امکان می دهد با فایل های مختلف کار کنید، نه فقط فایل های متنی. تعداد زیادی کتابخانه داخلی و توابع اضافی برای کار با انواع مختلف داده ها از فایل ها، از جمله JSON و CSV وجود دارد.
برای اینکه ببینید بسته به موقعیت چگونه رفتار متفاوتی دارند، میتوانید با پرچمها و مجوزهای فایل مختلف که برای استفاده با OpenFile() در دسترس هستند، آزمایش کنید.