File R/W ======== .. raw:: html Read from a file ---------------- Assuming a file called ``some_file.txt`` already exists in the *same* folder as this Python script, and the contents of that file are ``hello, world!``. The following python script will: - open the file, - read its contents (as a ``str``) into a variable called ``contents``, - close the file (by virtue of leaving the ``with`` context), - then print out ``hello, world!``. .. code-block:: python with open("some_file.txt", "r") as f: contents = f.read() print(contents) Read multiple lines from a file ------------------------------- .. code-block:: python with open("read_mult_lines.txt", "r") as f: for line in f: print(line.strip()) If you do not use the ``.strip()`` method, every line will be read in *with* the ``\n`` character at the end. ``.strip()`` gets rid of it. .. note:: To be a bit more explicit, use the ``.readlines()`` method in your loop. .. code-block:: python :emphasize-lines: 1 for line in f.readlines(): pass Write to a file --------------- The **w**\rite flag ``"w"`` will *overwrite* the entire file's contents. .. code-block:: python with open("write_to_file.txt", "w") as f: f.write("Hello. I am writing to a file!\n") f.write("Next line!") .. note:: The ``.write()`` method *does not* automatically add a new line at the end. If you want something on a new line, the new-line character (``\n``) *must* be manually placed somewhere. Append to a file ---------------- The **a**\ppend flag, ``"a"`` will allow you to write to the end of a file, without overwriting its contents. .. code-block:: python with open("append_to_file.txt", "a") as f: f.write("hello\n") .. note:: Remember the ``.write()`` method doesn't add a new-line character for you. See :ref:`file-rw:write to a file` note for more info. Write multiple lines to a file ------------------------------ If we had a list of marks we wanted saved permenantly into a file, we could use this script:: marks = [56, 87, 34, 76, 87, 88] with open("marks.txt", "w") as f: for mark in marks: f.write(f"{mark}\n") Just use a loop to call the ``.write()`` method multiple times. Write JSON data to a file ------------------------- `JSON `_ is a web-standard structure for transporting data back and forth between clients (a web browser) and web-servers. Python comes with a very useful ``json`` library that can help write information contained in dictionaries to files extremely easily. All you need is a :ref:`Python dictionary ` and the ``json.dump()`` function. .. code-block:: python import json data = { "name": "Jeff", "marks": [77, 88, 99], "happy": True } with open("jeff_info.json", "w") as f: json.dump(data, f, indent=4) The use of the ``indent=4`` key-word argument is optional, however, it makes the output much nicer to read. This will write to a file called ``jeff_info.json`` the following: .. code-block:: json { "name": "Jeff", "marks": [ 77, 88, 99 ], "happy": true } Notice that the JSON is *nearly* identical to the Python dictionary. Load JSON data from a file -------------------------- In order for the ``json.load()`` function to operate correctly, the file it is attempting to read *must* be 100% valid JSON, or there will be errors while calling the function. .. code-block:: python with open("jeff_info.json", "r") as f: data = json.load(f) print(data) # just a regular, old-fashioned, python dictionary Changing the contents of a file ------------------------------- To change the contents of a file, you must not only *load* the contents of the file into your Python progam and change the values, you must also then *write* back to the file for the changes to actually be saved.