{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Software Entwicklung \n",
    "\n",
    "## Kapitel 9: IO\n",
    "\n",
    "### 9.4 Dateien lesen\n",
    "\n",
    "Bei großen Dateien sollte vom vollständigen Einlesen mittels\n",
    "<code>read</code> Abstand genommen werden, weil dann\n",
    "der gesamte Dateiinhalt im Speicher gehalten werden muss.\n",
    "Vielmehr sollte in diesem Fall der Inhalt sukzessive eingelesen\n",
    "werden."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Zu diesem Zweck kann <code>read</code> mit einem Parameter\n",
    "aufgerufen werden, der die maximale Anzahl Bytes angibt,\n",
    "die gelesen werden sollen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "with open(\"091a Textdatei\", \"r\") as f:\n",
    "    block_size = 10\n",
    "    block = f.read(block_size)\n",
    "\n",
    "    while len(block)>0:\n",
    "        print(block, end='*')\n",
    "        block = f.read(block_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Man kann sich das schrittweise Einlesen der Datei mit Hilfe\n",
    "eines Schreib-/Lesekopfs vorstellen, der sich\n",
    "entlang eines Stroms von Bytes bzw. Zeichen bewegt.\n",
    "Jeder Lesevorgang bewegt den Kopf um die Anzahl der\n",
    "gelesenen Zeichen vorwärts. Die Position des Kopfs\n",
    "innerhalb der Datei kann mittels <code>tell</code>\n",
    "ermittelt werden."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "with open(\"091a Textdatei\", \"r\") as f:\n",
    "    block_size = 10\n",
    "    block = f.read(block_size)\n",
    "\n",
    "    while len(block)>0:\n",
    "        print(block, end='')\n",
    "        pos = f.tell()\n",
    "        print(f\"<{pos}>\", end='')\n",
    "        block = f.read(block_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Die Position des Schreib-/Lesekopfs lässt sich auch\n",
    "durch die Methode <code>seek</code> verändern."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "with open(\"091a Textdatei\", \"r\") as f:\n",
    "    f.seek(110)\n",
    "    print(f.read())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Textdateien sind i.d.R. in Zeilen aufgeteilt, die jeweils\n",
    "mit einem Zeilenendezeichen abschließen. Die Methode\n",
    "<code>readline</code> liest aus einer Textdatein\n",
    "die Daten bis zum nächsten Zeilenende."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "with open(\"091a Textdatei\", \"r\") as f:\n",
    "    line = f.readline()\n",
    "    while len(line)>0:\n",
    "        print(line, end='')\n",
    "        line = f.readline()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Diese häufig benötigte Variante des Lesens einer Textdatei\n",
    "kann in Python auch mittels einer <code>for</code>-Schleife\n",
    "realisiert werden."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "with open(\"091a Textdatei\", \"r\") as f:\n",
    "    for line in f:\n",
    "        print(line, end='')"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
