Python Dosya İşlemleri I/O
Bu öğreticide Python dosya işlemleri hakkında bilgi edineceksiniz. Daha spesifik olarak, bir dosyayı açma, ondan okuma, içine yazma, kapatma ve bilmeniz gereken çeşitli dosya yöntemleri.
Dosyalar
Dosyalar, ilgili bilgileri depolamak için diskteki adlandırılmış konumlardır. Verileri kalıcı olarak kalıcı bir bellekte (örn. sabit disk) depolamak için kullanılırlar.
Rastgele Erişimli Bellek (RAM) geçici olduğundan (bilgisayar kapatıldığında verilerini kaybeder), dosyaları, verileri kalıcı olarak depolayarak gelecekte kullanmak üzere kullanırız.
Bir dosyadan okumak veya bir dosyaya yazmak istediğimizde önce onu açmamız gerekir. İşimiz bittiğinde, dosyaya bağlı kaynakların serbest kalması için kapatılması gerekiyor.
Bu nedenle, Python’da bir dosya işlemi aşağıdaki sırayla gerçekleşir:
- Bir dosya aç
- Oku veya yaz (işlemi gerçekleştir)
- dosyayı kapat
Python’da Dosya Açmak
open()
Python, bir dosyayı açmak için yerleşik bir işleve sahiptir. Bu işlev, dosyayı uygun şekilde okumak veya değiştirmek için kullanıldığından, tutamaç olarak da adlandırılan bir dosya nesnesi döndürür.
1 2 | >>> f = open("test.txt") # open file in current directory >>> f = open("C:/Python38/README.txt") # specifying full path |
Bir dosya açarken modu belirtebiliriz. r
Modda, dosyayı okumak mı , yazmak mı yoksa dosyaya w
eklemek mi istediğimizi belirtiriz . a
Dosyayı metin modunda mı yoksa ikili modda mı açmak istediğimizi de belirtebiliriz.
Varsayılan, metin modunda okumaktır. Bu modda, dosyadan okurken dizeler alırız.
Öte yandan, ikili mod bayt döndürür ve bu, resimler veya yürütülebilir dosyalar gibi metin olmayan dosyalarla uğraşırken kullanılacak moddur.
mod | Tanım |
---|---|
r | Okumak için bir dosya açar. (varsayılan) |
w | Yazmak için bir dosya açar. Mevcut değilse yeni bir dosya oluşturur veya varsa dosyayı keser. |
x | Özel oluşturma için bir dosya açar. Dosya zaten varsa, işlem başarısız olur. |
a | Dosyayı kesmeden sonuna eklemek için bir dosya açar. Mevcut değilse yeni bir dosya oluşturur. |
t | Metin modunda açılır. (varsayılan) |
b | İkili modda açılır. |
+ | Güncelleme için bir dosya açar (okuma ve yazma) |
1 2 3 | f = open("test.txt") # equivalent to 'r' or 'rt' f = open("test.txt",'w') # write in text mode f = open("img.bmp",'r+b') # read and write in binary mode |
Diğer dillerden farklı olarak, karakter , (veya diğer eşdeğer kodlamalar) a
kullanılarak kodlanana kadar 97 sayısını ifade etmez .ASCII
Ayrıca, varsayılan kodlama platforma bağlıdır. Windows’ta, cp1252
ancak utf-8
Linux’ta.
Bu nedenle, varsayılan kodlamaya da güvenmemeliyiz, aksi takdirde kodumuz farklı platformlarda farklı davranacaktır.
Bu nedenle, metin modunda dosyalarla çalışırken, kodlama türünü belirtmeniz önemle tavsiye edilir.
1 | f = open("test.txt", mode='r', encoding='utf-8') |
Python’da Dosyaları Kapatmak
Dosya üzerinde işlemlerimiz bittiğinde dosyayı düzgün bir şekilde kapatmamız gerekiyor.
Bir dosyayı kapatmak, dosyaya bağlı olan kaynakları serbest bırakacaktır. close()
Python’da bulunan yöntem kullanılarak yapılır .
Python’un başvurulmayan nesneleri temizlemek için bir çöp toplayıcısı vardır, ancak dosyayı kapatmak için ona güvenmemeliyiz.
1 2 3 | f = open("test.txt", encoding = 'utf-8') # perform file operations f.close() |
Bu yöntem tamamen güvenli değildir. Dosya ile bazı işlemler yaparken bir istisna oluşursa, kod dosyayı kapatmadan çıkar.
Daha güvenli bir yol, try…finally bloğunu kullanmaktır.
1 2 3 4 5 | try: f = open("test.txt", encoding = 'utf-8') # perform file operations finally: f.close() |
Bu şekilde, program akışının durmasına neden olan bir istisna ortaya çıksa bile dosyanın düzgün bir şekilde kapatıldığını garanti ediyoruz.
Bir dosyayı kapatmanın en iyi yolu with
deyimi kullanmaktır. with
Bu, ifadenin içindeki bloktan çıkıldığında dosyanın kapatılmasını sağlar .
close()
Yöntemi açıkça çağırmamıza gerek yok . Dahili olarak yapılır.
1 2 | with open("test.txt", encoding = 'utf-8') as f: # perform file operations |
Python’da Dosyalara Yazma
Python’da bir dosyaya yazmak için onu write w
, append a
veya özel oluşturma x
modunda açmamız gerekir.
w
Halihazırda mevcutsa dosyanın üzerine yazacağından kipte dikkatli olmamız gerekiyor . Bu nedenle, önceki tüm veriler silinir.
write()
Metot kullanılarak bir dizi veya bayt dizisi (ikili dosyalar için) yazılır . Bu yöntem, dosyaya yazılan karakter sayısını döndürür.
1 2 3 4 | with open("test.txt",'w',encoding = 'utf-8') as f: f.write("my first file\n") f.write("This file\n\n") f.write("contains three lines\n") |
test.txt
Bu program , mevcut dizinde yoksa yeni bir dosya oluşturacaktır . Varsa, üzerine yazılır.
Farklı satırları ayırt etmek için yeni satır karakterlerini kendimiz eklemeliyiz.
Python’da Dosya Okumak
Python’da bir dosyayı okumak için dosyayı okuma r
modunda açmalıyız.
Bu amaçla çeşitli yöntemler mevcuttur. read(size)
Okumak için yöntemi kullanabilirizboyutveri sayısı. Eğerboyutparametre belirtilmezse dosyayı okur ve dosyanın sonuna kadar döner.
text.txt
Yukarıdaki bölümde yazdığımız dosyayı şu şekilde okuyabiliriz :
1 2 3 4 5 6 7 8 9 10 11 12 | >>> f = open("test.txt",'r',encoding = 'utf-8') >>> f.read(4) # read the first 4 data 'This' >>> f.read(4) # read the next 4 data ' is ' >>> f.read() # read in the rest till end of file 'my first file\nThis file\ncontains three lines\n' >>> f.read() # further reading returns empty sting '' |
read()
Yöntemin olarak yeni bir satır döndürdüğünü görebiliriz '\n'
. Dosyanın sonuna ulaşıldığında, daha fazla okumada boş bir dize alırız.
Yöntemi kullanarak mevcut dosya imlecimizi (konumunu) değiştirebiliriz seek()
. Benzer şekilde, tell()
yöntem mevcut konumumuzu (bayt sayısı olarak) döndürür.
1 2 3 4 5 6 7 8 9 10 | >>> f.tell() # get the current file position 56 >>> f.seek(0) # bring file cursor to initial position 0 >>> print(f.read()) # read the entire file This is my first file This file contains three lines |
For döngüsü kullanarak bir dosyayı satır satır okuyabiliriz . Bu hem verimli hem de hızlıdır.
1 2 3 4 5 6 | >>> for line in f: ... print(line, end = '') ... This is my first file This file contains three lines |
Bu programda, dosyanın kendisindeki satırlar bir yeni satır karakteri içerir \n
. print()
Bu nedenle, yazdırma sırasında iki yeni satırdan kaçınmak için işlevin bitiş parametresini kullanırız.
Alternatif olarak, readline()
bir dosyanın tek tek satırlarını okumak için yöntemi kullanabiliriz. Bu yöntem, yeni satır karakteri de dahil olmak üzere yeni satıra kadar bir dosyayı okur.
1 2 3 4 5 6 7 8 9 10 11 | >>> f.readline() 'This is my first file\n' >>> f.readline() 'This file\n' >>> f.readline() 'contains three lines\n' >>> f.readline() '' |
Son olarak, readlines()
yöntem tüm dosyanın kalan satırlarının bir listesini döndürür. Tüm bu okuma yöntemleri, dosyanın sonuna (EOF) ulaşıldığında boş değerler döndürür.
1 2 | >>> f.readlines() ['This is my first file\n', 'This file\n', 'contains three lines\n'] |
Python Dosya Yöntemleri
Dosya nesnesi ile kullanılabilen çeşitli yöntemler vardır. Bazıları yukarıdaki örneklerde kullanılmıştır.
Kısa bir açıklama ile metin modundaki yöntemlerin tam listesi:
Yöntem | Tanım |
---|---|
kapat() | Açılan bir dosyayı kapatır. Dosya zaten kapalıysa hiçbir etkisi yoktur. |
ayır() | Temeldeki ikili arabelleği, öğesinden ayırır TextIOBase ve onu döndürür. |
dosya yok() | Dosyanın bir tamsayı numarasını (dosya tanıtıcısı) döndürür. |
floş() | Dosya akışının yazma arabelleğini temizler. |
isatty() | True Dosya akışı etkileşimliyse döner . |
okuman(n) | en fazla okurndosyadan karakterler. Negatif ise dosyanın sonuna kadar okur veya None . |
okunabilir() | True Dosya akışının okunup okunmadığını döndürür . |
okuma satırı(n=-1) | Dosyadan bir satır okur ve döndürür. En fazla okurnbayt belirtilirse. |
okuma satırları(n=-1) | Dosyadan satırların bir listesini okur ve döndürür. En fazla okurnbelirtilmişse bayt/karakter. |
aramak(telafi etmek,itibaren= SEEK_SET ) | Dosya konumunu şu şekilde değiştirir:telafi etmekbayt, referans olarakitibaren(başlangıç, akım, bitiş). |
aranabilir() | True Dosya akışı rastgele erişimi destekliyorsa döndürür . |
söylemek() | Dosyanın nesnesinin geçerli konumunu temsil eden bir tamsayı döndürür. |
kesmek(boyut= None ) | Dosya akışını yeniden boyutlandırırboyutbayt. Eğerboyutbelirtilmemişse, geçerli konuma göre yeniden boyutlandırılır. |
yazılabilir() | True Dosya akışına yazılabiliyorsa döndürür . |
yazmak(s) | dize yazarsdosyaya ve yazılan karakter sayısını döndürür. |
yazı satırları(çizgiler) | bir listesini yazarçizgilerdosyaya. |