210 lines
26 KiB
Plaintext
210 lines
26 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "e87e5c8f-564b-4330-b7db-bd4c20451c1b",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import matplotlib.pyplot as plt"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "c879ab27-3c6d-4fcf-b3e9-54596e952b9d",
|
|
"metadata": {},
|
|
"source": [
|
|
"# reading CSV files with pure Python\n",
|
|
"\n",
|
|
"CSV (\"comma separated values\") files are very widely used for storing tables of data. Excel and Google Sheets can read and write CSV files quite easily. They are also \"human readable\" as data files -- you can open one it a simple text viewer program such as TextEdit as see the contents.\n",
|
|
"\n",
|
|
"Unfortunately they are not totally standard. Here we will open one and read its contents into a dictionary. The dictionary will have one key for each column and a list of values for each row.\n",
|
|
"\n",
|
|
"For example, with `file.csv` like so:\n",
|
|
"\n",
|
|
"```\n",
|
|
"column 1,column 2\n",
|
|
"1,2\n",
|
|
"3,4\n",
|
|
"```\n",
|
|
"\n",
|
|
"We would like to extract a dictionary like this:\n",
|
|
"\n",
|
|
"```python\n",
|
|
"{'column 1': [1,2], 'column 2': [3,4]}\n",
|
|
"```\n",
|
|
"\n",
|
|
"We will now do this for the file `iris.csv` which contains the data used above."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "d10cc532-f354-4262-8a98-55b4f4fdea64",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"fobj = open(\"iris.csv\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "95fdd89a-6ae0-4ecc-bd0b-1fc34472533a",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"'sepal_length,sepal_width,petal_length,petal_width,species\\n'\n",
|
|
"'5.1,3.5,1.4,0.2,setosa\\n'\n",
|
|
"'4.9,3.0,1.4,0.2,setosa\\n'\n",
|
|
"'4.7,3.2,1.3,0.2,setosa\\n'\n",
|
|
"'4.6,3.1,1.5,0.2,setosa\\n'\n",
|
|
"'5.0,3.6,1.4,0.2,setosa\\n'\n",
|
|
"'5.4,3.9,1.7,0.4,setosa\\n'\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"fobj = open(\"iris.csv\")\n",
|
|
"for line_num, line in enumerate(fobj.readlines()):\n",
|
|
" print(repr(line))\n",
|
|
" if line_num > 5:\n",
|
|
" break"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "c74368aa-143f-4310-bdee-5bdab1802d7a",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"'sepal_length,sepal_width,petal_length,petal_width,species'\n",
|
|
"'5.1,3.5,1.4,0.2,setosa'\n",
|
|
"'4.9,3.0,1.4,0.2,setosa'\n",
|
|
"'4.7,3.2,1.3,0.2,setosa'\n",
|
|
"'4.6,3.1,1.5,0.2,setosa'\n",
|
|
"'5.0,3.6,1.4,0.2,setosa'\n",
|
|
"'5.4,3.9,1.7,0.4,setosa'\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"fobj = open(\"iris.csv\")\n",
|
|
"for line_num, line in enumerate(fobj.readlines()):\n",
|
|
" line = line.strip()\n",
|
|
" print(repr(line))\n",
|
|
" if line_num > 5:\n",
|
|
" break"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"id": "d73d37e3-876c-4576-a332-dc876726ad15",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"fobj = open(\"iris.csv\")\n",
|
|
"iris_dataset_from_csv= {}\n",
|
|
"for line_num, line in enumerate(fobj.readlines()):\n",
|
|
" line = line.strip()\n",
|
|
" entries = line.split(',')\n",
|
|
" # print(entries)\n",
|
|
" # if line_num > 5:\n",
|
|
" # break\n",
|
|
" if line_num == 0:\n",
|
|
" column_names = entries\n",
|
|
" for column_name in column_names:\n",
|
|
" iris_dataset_from_csv[column_name] = []\n",
|
|
" continue\n",
|
|
" # if we are here, we are line_num >= 1 and iris_dataset_from_csv is set up with columns and\n",
|
|
" # column_names has our column names in the right order.\n",
|
|
" for (column_name, entry) in zip(column_names, entries):\n",
|
|
" if column_name != 'species':\n",
|
|
" entry = float(entry)\n",
|
|
" iris_dataset_from_csv[column_name].append(entry) "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"id": "d803ec2c-dc0e-4456-b040-c44393a2b71c",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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J0bjagx61bUiqMagVydG49r3VlRDF6fLXpOt825rXSgeP0OU0zV9dPncuXNauXKlDh48qDvuuKPgY5544gm9/PLLevvtt2dv2759u373u9/p0KFDRX0fPrpc2fL5vH7//i+1SPjK3VKjsYQijX5tWB2u2NPHuVxO/++3wzoxGtcNbfVX3H98dFI3rKrTZ29eXba3hGydd1vrQvH4GaJYpl6/r+m3ZiwWkyQ1NzfP+5hDhw5p69atc267++67dfjwYaXThTvvZDKpiYmJOV+oXLWQjHtuKqXTYwlFwoUTjiNhv4YuTOvcVOFt4ZeCrfNua10oHj9DlNuim5V8Pq8dO3bo05/+tDZs2DDv40ZGRtTW1jbntra2NmUyGZ0/f77gc3bt2qVwODz71dnZudgyYYFaSMadSWeVyuQVmCeDxu9xKZW5tA18udg677bWheLxM0S5LbpZ+fKXv6y33npLL7zwwoKP/fBpwMvvPM13enDnzp2KxWKzX0NDQ4stExaohWRcv8clr9uhxDx/Sc6ks/K6HfJ7yheoZ+u821oXisfPEOW2qJX0yCOP6OWXX9b+/fvV0dFx1ceuWrVKIyMjc247e/as3G63WlpaCj7H5/OpoaFhzhcqVy0k47bWedXRHFA0VjjhOBqbUWdLUK11hU+bLwVb593WulA8foYot5KalXw+ry9/+ct66aWX9F//9V/q7u5e8Dm9vb3q7++fc9urr76qzZs3y+Pho221oBaScZ1Op27pblFj0KPjo5OanEkrnc1pciat46OTagx6tHltc1n3W7F13m2tC8XjZ4hyK+nTQH/3d3+nH/3oR/rJT34yZ2+VcDisQODSFeE7d+7U8PCw9uzZI+nSR5c3bNighx56SF/60pd06NAhbd++XS+88ILuu+++or4vnwaqDrWQjFton5XOlqA2r222ap8VG+bd1rpQPH6GWMiypC7P1yU/99xzevDBByVJDz74oN577z0dOHBg9v6DBw/qsccem90U7oknnihpUzialepRC7tdsoNt5deF4vEzxNUsS7OyXGhWAACoPFbsswIAALDUaFYAAIDVSF1GWdn6/nY2m9XJsYTiyYxCPre6mgNyuRb3sUtbxwgAlYpmBWVja0LrQDSm/qMjGjw/rXQmJ4/bqe4VQd21fpXWRcIlHcvWMQJAJaNZQVlcTmiNJzNqCnrldTuV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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(iris_dataset_from_csv['sepal_width'], iris_dataset_from_csv['petal_width'],'o', alpha=0.2);"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "d6539f9f-726b-4f49-84d0-54356022b572",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Using matplotlib from Python programs (not in Jupyter):\n",
|
|
"\n",
|
|
"Open an interactive window:\n",
|
|
"\n",
|
|
"```python\n",
|
|
"plt.show()\n",
|
|
"```\n",
|
|
"\n",
|
|
"Save figure to file\n",
|
|
"\n",
|
|
"```python\n",
|
|
"plt.savefig(\"plot_filename.png\")\n",
|
|
"```"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "d00eb38c-03cc-480c-aefd-6a21d54c7325",
|
|
"metadata": {},
|
|
"source": [
|
|
"Live demo of all the above to call `plt.savefig()`."
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"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.11.7"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|