‘r’ - odczyt (read) Otwiera plik do odczytu. Jest to tryb domyślny, jeśli nie podano trybu podczas otwierania pliku.
‘w’ - zapis (write) Otwiera plik do zapisu. Jeśli plik istnieje, jego zawartość zostanie nadpisana. Jeśli plik nie istnieje, zostanie utworzony.
‘a’ - dopisywanie (append) Otwiera plik do zapisu, ale zamiast nadpisywać zawartość, dodaje nową zawartość na końcu pliku. Jeśli plik nie istnieje, zostanie utworzony.
‘x’ - tworzenie (create) Otwiera plik wyłącznie do tworzenia. Jeśli plik istnieje, funkcja open() zwróci błąd. Jeśli plik nie istnieje, zostanie utworzony.
‘b’ - binarny (binary) Dodawany do jednego z powyższych trybów, wskazuje, że plik ma być obsługiwany jako plik binarny. W przypadku plików tekstowych, tryb binarny nie jest dodawany.
‘t’ - tekstowy (text) Oznacza, że plik ma być obsługiwany jako plik tekstowy. Jest to domyślne zachowanie, jeśli nie podano trybu binarnego.
‘+’ - aktualizacja (update) Dodawany do jednego z powyższych trybów (oprócz ‘x’), umożliwia jednoczesny odczyt i zapis pliku.
Kombinacje trybów:
Jak wybrać?
IOBase
to klasa bazowa dla wszystkich klas strumieni I/O w module io
. Definiuje podstawowe metody, takie jak close()
, flush()
, seek()
, tell()
oraz __enter__()
i __exit__()
, które umożliwiają korzystanie z bloków with
. Ta klasa nie powinna być używana bezpośrednio, ale stanowi podstawę dla bardziej wyspecjalizowanych klas.RawIOBase
to klasa bazowa dla surowych (raw) strumieni I/O, które obsługują operacje na niskim poziomie. Strumienie surowe operują na bajtach i nie korzystają z buforowania. Ta klasa rozszerza IOBase
i implementuje dodatkowe metody, takie jak read()
, readall()
, readinto()
, write()
oraz metody operujące na plikach, takie jak truncate()
czy seek()
. Klasy pochodne od RawIOBase
są używane, gdy konieczne jest bezpośrednie czytanie lub zapisywanie danych binarnych z/do urządzenia I/O (np. plików, gniazd sieciowych).BufferedIOBase
to klasa bazowa dla buforowanych strumieni I/O. Buforowanie polega na tym, że dane są przechowywane w pamięci podręcznej, zanim zostaną przesłane do urządzenia I/O lub z niego odczytane. Buforowanie pomaga poprawić wydajność strumieni I/O, szczególnie gdy operacje odczytu/zapisu są małe lub wykonywane w sposób nieciągły. Klasa BufferedIOBase
rozszerza klasę IOBase
i definiuje dodatkowe metody, takie jak read()
, readinto()
, write()
oraz detach()
. Klasy pochodne od BufferedIOBase
obejmują BufferedReader
, BufferedWriter
oraz BufferedRandom
, które implementują buforowane strumienie binarne.TextIOBase: TextIOBase
to klasa bazowa dla strumieni tekstowych I/O. Strumienie tekstowe działają na poziomie znaków, a nie bajtów, i zajmują się dekodowaniem i kodowaniem danych w trakcie odczytu i zapisu. Klasa TextIOBase
rozszerza klasę IOBase
i definiuje dodatkowe metody, takie jak read()
, readline()
, readlines()
, write()
, writelines()
oraz detach()
. Klasa TextIOWrapper
dziedziczy po klasie TextIOBase
i implementuje strumień tekstowy z użyciem buforowanego strumienia binarnego jako źródła danych. Strumienie tekstowe są wykorzystywane w przypadku pracy z plikami tekstowymi, gdzie zachodzi konieczność obsługi kodowania znaków.
import sys
if sys.stdin.isatty():
print('Standardowy strumień wejścia jest powiązany z interaktywnym terminalem.')
else:
print('Standardowy strumień wejścia nie jest powiązany z interaktywnym terminalem.')
if sys.stdout.isatty():
print('Standardowy strumień wyjścia jest powiązany z interaktywnym terminalem.')
else:
print('Standardowy strumień wyjścia nie jest powiązany z interaktywnym terminalem.')
with open('plik.txt', 'rb') as file:
# Przesuń wskaźnik pliku na początek pliku (domyślnie)
file.seek(0)
# Odczytaj i wyświetl pierwszych 5 bajtów
print(file.read(5))
# Przesuń wskaźnik pliku 10 bajtów od początku pliku
file.seek(10)
# Odczytaj i wyświetl kolejnych 5 bajtów
print(file.read(5))
# Przesuń wskaźnik pliku 5 bajtów od bieżącej pozycji (whence=1)
file.seek(5, 1)
# Odczytaj i wyświetl kolejnych 5 bajtów
print(file.read(5))
# Przesuń wskaźnik pliku 5 bajtów przed koniec pliku (whence=2)
file.seek(-5, 2)
# Odczytaj i wyświetl ostatnich 5 bajtów
print(file.read(5))
with open('plik.txt', 'r') as file:
# Sprawdź pozycję wskaźnika pliku na początku pliku
position = file.tell()
print(f'Aktualna pozycja wskaźnika pliku: {position}')
# Odczytaj pierwszych 5 bajtów
file.read(5)
# Sprawdź pozycję wskaźnika pliku po odczytaniu 5 bajtów
position = file.tell()
print(f'Aktualna pozycja wskaźnika pliku: {position}')
# Przesuń wskaźnik pliku 10 bajtów od początku pliku
file.seek(10)
# Sprawdź pozycję wskaźnika pliku po przesunięciu
position = file.tell()
print(f'Aktualna pozycja wskaźnika pliku: {position}')
with open('plik.txt', 'r+') as file:
# Odczytaj i wyświetl zawartość pliku przed skróceniem
file.seek(0)
content = file.read()
print(f'Zawartość pliku przed skróceniem: {content}')
# Przesuń wskaźnik pliku 10 bajtów od początku pliku
file.seek(10)
# Skróć plik do bieżącej pozycji wskaźnika pliku (10 bajtów)
file.truncate()
# Odczytaj i wyświetl zawartość pliku po skróceniu
file.seek(0)
content = file.read()
print(f'Zawartość pliku po skróceniu: {content}')
import io
class ExampleRawIO(io.RawIOBase):
def __init__(self, data):
self.data = data.encode('utf-8')
self.index = 0
def readinto(self, b):
read_length = min(len(b), len(self.data) - self.index)
b[:read_length] = self.data[self.index:self.index+read_length]
self.index += read_length
return read_length
data = "To jest przykładowy tekst."
# Tworzymy obiekt typu ExampleRawIO (RawIOBase) z przykładowymi danymi
example_raw_io = ExampleRawIO(data)
# Odczytujemy wszystkie dane za pomocą metody readall()
all_data = example_raw_io.readall()
# Dekodujemy dane do postaci ciągu znaków i wyświetlamy
print("Odczytane dane:", all_data.decode('utf-8'))
import io
class ExampleRawIO(io.RawIOBase):
def __init__(self, data):
self.data = data.encode('utf-8')
self.index = 0
def readinto(self, b):
read_length = min(len(b), len(self.data) - self.index)
b[:read_length] = self.data[self.index:self.index+read_length]
self.index += read_length
return read_length
data = "To jest przykładowy tekst."
# Tworzymy obiekt typu ExampleRawIO (RawIOBase) z przykładowymi danymi
example_raw_io = ExampleRawIO(data)
# Tworzymy bufor do przechowywania odczytanych danych
buffer = bytearray(20)
# Odczytujemy dane za pomocą metody readinto()
bytes_read = example_raw_io.readinto(buffer)
# Wyświetlamy liczbę odczytanych bajtów oraz odczytane dane
print(f"Odczytano {bytes_read} bajtów")
print("Odczytane dane:", buffer[:bytes_read].decode('utf-8'))
itertools
https://docs.python.org/3/library/itertools.html
Moduł itertools to część standardowej biblioteki Pythona, która oferuje zestaw szybkich, wydajnych narzędzi do pracy z iteratorami. Iterator to obiekt, który umożliwia przeglądanie kolejnych elementów kolekcji (np. listy, krotki, słownika) w sposób sekwencyjny. Moduł itertools jest szczególnie użyteczny w przypadku operacji na dużych zbiorach danych lub sekwencjach nieskończonych, gdyż pozwala na oszczędzenie pamięci poprzez pracę z danymi w sposób leniwy (ang. lazy).
import itertools
# iterator cykliczny powtarzający elementy z listy
colors = itertools.cycle(['red', 'green', 'blue'])
# pobieranie kolejnych elementów z iteratora
print(next(colors)) # 'red'
print(next(colors)) # 'green'
print(next(colors)) # 'blue'
print(next(colors)) # 'red'
print(next(colors)) # 'green'
print(next(colors)) # 'blue'
import itertools
# iterator skumulowanych sum na liście [1, 2, 3, 4, 5]
cumulative_sums = itertools.accumulate([1, 2, 3, 4, 5])
# pobieranie kolejnych wartości z iteratora zwracającego skumulowane sumy
print(list(cumulative_sums)) # [1, 3, 6, 10, 15]
# iterator skumulowanych iloczynów na liście [1, 2, 3, 4, 5]
cumulative_products = itertools.accumulate([1, 2, 3, 4, 5], lambda x, y: x * y)
# pobieranie kolejnych wartości z iteratora zwracającego skumulowane iloczyny
print(list(cumulative_products)) # [1, 2, 6, 24, 120]
import itertools
# lista zawierająca losowe wartości
data = [1, 2, 3, 4, 5, 6]
# lista zawierająca wartości boolowskie
selector = [True, False, True, False, True, False]
# filtracja elementów z użyciem compress()
filtered = itertools.compress(data, selector)
# wyświetlanie przefiltrowanych elementów
for item in filtered:
print(item)
import itertools
# lista zawierająca liczby parzyste i nieparzyste
numbers = [2, 4, 6, 9, 8, 10, 11, 12]
# funkcja lambda sprawdzająca, czy liczba jest parzysta
is_even = lambda x: x % 2 == 0
# pomijanie elementów początkowej sekwencji z użyciem dropwhile()
filtered = itertools.dropwhile(is_even, numbers)
# wyświetlanie pominiętych elementów
for item in filtered:
print(item)
import itertools
# lista zawierająca liczby parzyste i nieparzyste
numbers = [1, 2, 3, 4, 5, 6]
# funkcja lambda sprawdzająca, czy liczba jest parzysta
is_even = lambda x: x % 2 == 0
# filtracja elementów z użyciem filterfalse()
filtered = itertools.filterfalse(is_even, numbers)
# wyświetlanie przefiltrowanych elementów
for item in filtered:
print(item)
import itertools
# lista zawierająca kody pocztowe
postal_codes = [
'02-001', '02-002', '05-001', '05-002', '03-001', '03-002', '03-003'
]
# funkcja zwracająca pierwsze dwie cyfry kodu pocztowego
get_prefix = lambda code: code[:2]
# grupowanie kodów pocztowych według pierwszych dwóch cyfr
grouped = itertools.groupby(postal_codes, get_prefix)
# wyświetlanie grup i przynależnych do nich elementów
for prefix, group in grouped:
print(f"Prefix: {prefix}")
print(f"Codes: {list(group)}")
print()
import itertools
# funkcja zwracająca sumę dwóch liczb
def add(x, y):
return x + y
# sekwencja krotek zawierających dwie liczby
numbers = [(1, 2), (3, 4), (5, 6)]
# wywołanie funkcji add() dla każdej krotki z użyciem starmap()
results = itertools.starmap(add, numbers)
# wyświetlanie wyników
for result in results:
print(result)
import itertools
# Oryginalna sekwencja, dla której chcemy utworzyć niezależne iteratory
sequence = [1, 2, 3, 4, 5]
# Utworzenie 3 niezależnych iteratorów na podstawie oryginalnej sekwencji
iterators = itertools.tee(iter(sequence), 3)
# Wyświetlenie elementów z każdego iteratora
for i, iterator in enumerate(iterators):
print(f"Iterator {i + 1}:")
for item in iterator:
print(item)
print()
import itertools
# Sekwencja, dla której chcemy wygenerować permutacje
sequence = ['A', 'B', 'C']
# Utworzenie iteratora, który generuje permutacje o długości 3 (domyślnie długość sekwencji)
permutations_iterator = itertools.permutations(sequence, 3)
# Wyświetlenie elementów z iteratora
for item in permutations_iterator:
print(item)
import itertools
# Sekwencja, dla której chcemy wygenerować kombinacje
sequence = ['A', 'B', 'C', 'D']
# Utworzenie iteratora, który generuje kombinacje o długości 2
combinations_iterator = itertools.combinations(sequence, 2)
# Wyświetlenie elementów z iteratora
for item in combinations_iterator:
print(item)