{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Structured Data Files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this section we focus on reading from and writing to files with a row-column format, such as is found in comma-separated (csv) and tab-separated (tsv) data files.\n", "\n", "Although `numpy.loadtxt()` is suitable for this task, it is valuable to be able to write your own code solution." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Writing a Data File" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us generate some data and write it in a csv format (comma-separated values). In general what you use as the separator (delimiter) for your data is up to you, but if we use a .csv file extension it's best to stick to the standard." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "#Generating data\n", "x = np.linspace(0, 2*np.pi)\n", "y = np.sin(x)\n", "z = np.cos(x)\n", "\n", "#Writing the data to file in csv format\n", "with open('data1.csv', 'w') as f:\n", " f.write('x,sin(x),cos(x)\\n') #Header\n", " \n", " for xx, yy, zz in zip(x, y, z):\n", " f.write(f'{xx},{yy},{zz}\\n')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you are not familiar with the string formatting used (`f'{xx},{yy},{zz}\\n'`) see the page [**The Python Standard Library/Strings/String Formatting**](../strings/string-formatting). Note that it is in this line (and also in the header) that we have separated the values with commas." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the file extension **.csv** acts more as a hint for other software. There is no physical difference between a file we write with this extension or any other extension (including no extension). As long as the file mode is set to text (`'t'`), we are writing plain text files." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The output of our data file **data1.csv** looks like:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "tags": [ "remove_input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x,sin(x),cos(x)\n", "0.0,0.0,1.0\n", "0.1282282715750936,0.127877161684506,0.9917900138232462\n", "0.2564565431501872,0.25365458390950735,0.9672948630390295\n", "0.38468481472528077,0.3752670048793741,0.9269167573460217\n", "0.5129130863003744,0.49071755200393785,0.8713187041233894\n", "0.6411413578754679,0.5981105304912159,0.8014136218679567\n", "0.7693696294505615,0.6956825506034864,0.7183493500977276\n", "0.8975979010256552,0.7818314824680298,0.6234898018587336\n", "1.0258261726007487,0.8551427630053461,0.5183925683105252\n", "\n" ] } ], "source": [ "with open('data1.csv', 'r') as f:\n", " data1 = f.readlines()\n", "\n", "print(('{}'*10).format(*data1[:10]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or in a more presentable format:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "tags": [ "remove_input" ] }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
xsin(x)cos(x)
0.0000000.000000e+001.000000
0.1282281.278772e-010.991790
0.2564572.536546e-010.967295
0.3846853.752670e-010.926917
.........
5.898500-3.752670e-010.926917
6.026729-2.536546e-010.967295
6.154957-1.278772e-010.991790
6.283185-2.449294e-161.000000
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "from IPython.display import display, HTML\n", "\n", "data1 = pd.read_csv('data1.csv')\n", "\n", "display(HTML(data1.to_html(max_rows = 8, index = False)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reading a Data File" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's read the data file we wrote. If we want to store each column in a separate list or array, it will be best to iterate through the lines of the file." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will need to divide the values from each line using the separator. To do this, we will use the `.split()` string method:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['a', 'b', 'c', 'd']" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'a b c d'.split()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see this splits the string into a list of strings. By default it uses a space as the dividing character, given a string argument it will use that as the delimiter instead:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['a', 'b', 'c', 'd']" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'a,b,c,d'.split(',')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We must keep in mind that the file we are reading has a header we want to read before any of the data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Something else to keep in mind is that the file contains text (or rather the content is a string). If we want to store the data as numbers, we need to convert them first." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "#Lists to hold the data\n", "x = []\n", "y = []\n", "z = []\n", "\n", "with open('data1.csv', 'r') as f:\n", " header = f.readline() #read header\n", " \n", " for line in f:\n", " line = line.strip() #This clears trailing whitespace (e.g. \\n)\n", " \n", " #Makes a list from the string using ',' as the seperator\n", " line = line.split(',')\n", " \n", " x.append(float(line[0]))\n", " y.append(float(line[1]))\n", " z.append(float(line[2]))\n", "\n", "#If you need to convert x, y, z to arrays:\n", "x = np.array(x)\n", "y = np.array(y)\n", "z = np.array(z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we start with lists and convert to an array later (if an array is needed). The reason for doing this is that we don't necessarily know how many lines the file has before we begin, and appending to lists is more easy and efficient than concatenating arrays." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As a sanity check, let's plot the data we have just read:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots()\n", "\n", "ax.plot(x, y, label = 'sin(x)')\n", "ax.plot(x, z, '--', label = 'cos(x)')\n", "\n", "ax.set_xlabel('x')\n", "ax.set_ylabel('y')\n", "ax.legend(loc = 9)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Writing and Reading a Tab Separated File" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you are comfortable with the sections above, you may skip this one. If you'd like to see another example of a data file with a different delimiter, we will write a data file using tab separation instead of commas (tsv)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "#Generating data\n", "x = np.linspace(0, 2, 100)\n", "y = np.sqrt(x)\n", "z = x*x\n", "\n", "#Writing a data file with space seperations\n", "with open('data2.tsv', 'w') as f:\n", " f.write('x\\ty\\tz\\n') #Header\n", " \n", " for xx, yy, zz in zip(x, y, z):\n", " f.write(f'{xx}\\t{yy}\\t{zz}\\n')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we use the special character `'\\t'` which stands for tabs.\n", "\n", "Again, the use of the **.tsv** file extension is a convention, it does not alter the nature of the file itself.\n", "\n", "The contents of the data file we have generated looks like this:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "tags": [ "remove_input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x\ty\tz\n", "0.0\t0.0\t0.0\n", "0.020202020202020204\t0.1421338109037403\t0.0004081216202428324\n", "0.04040404040404041\t0.20100756305184242\t0.0016324864809713297\n", "0.06060606060606061\t0.24618298195866548\t0.0036730945821854917\n", "0.08080808080808081\t0.2842676218074806\t0.006529945923885319\n", "0.10101010101010102\t0.31782086308186414\t0.010203040506070812\n", "0.12121212121212122\t0.3481553119113957\t0.014692378328741967\n", "0.14141414141414144\t0.3760507165451775\t0.019997959391898794\n", "0.16161616161616163\t0.40201512610368484\t0.026119783695541274\n", "\n" ] } ], "source": [ "with open('data2.tsv', 'r') as f:\n", " data2 = f.readlines()\n", "\n", "print(('{}'*10).format(*data2[:10]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's read the data keeping in mind that the values are now separated with tabs." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "#Lists to hold the data\n", "x = []\n", "y = []\n", "z = []\n", "\n", "with open('data2.tsv', 'r') as f:\n", " header = f.readline() #read header\n", " \n", " for line in f:\n", " line = line.strip() #This clears trailing whitespace (e.g. \\n)\n", " \n", " #Makes a list from the string using '\\t' as the seperator\n", " line = line.split('\\t')\n", " \n", " x.append(float(line[0]))\n", " y.append(float(line[1]))\n", " z.append(float(line[2]))\n", "\n", "#If you need to convert x, y, z to arrays:\n", "x = np.array(x)\n", "y = np.array(y)\n", "z = np.array(z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plotting this data:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots()\n", "\n", "ax.plot(x, y, label = r'$\\sqrt{x}$')\n", "ax.plot(x, z, '--', label = r'$x^2$')\n", "\n", "ax.set_xlabel('x')\n", "ax.set_ylabel('y')\n", "ax.legend(loc = 9)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reading Data in as a Single Array" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sometimes you want to read the data in as a single 2D array (for example if you have a large data file or if the number of columns in your data file aren't fixed). Let's read the file **data2.tsv** in this manner:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "#Lists to hold the data\n", "data = []\n", "\n", "with open('data2.tsv', 'r') as f:\n", " header = f.readline() #read header\n", " \n", " for line in f:\n", " line = line.strip() #This clears trailing whitespace (e.g. \\n)\n", " line = line.split('\\t') #Makes a list\n", " \n", " #Converting data to floats\n", " for i,col in enumerate(line):\n", " line[i] = np.float(col)\n", " \n", " data.append(line)\n", "\n", "#Converting data to array\n", "data = np.array(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that this gives us a similar output to NumPy's `numpy.loadtxt()`. Plotting the data (use slices to extract the columns):" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots()\n", "\n", "ax.plot(data[:,0], data[:,1], label = r'$\\sqrt{x}$')\n", "ax.plot(data[:,0], data[:,2], '--', label = r'$x^2$')\n", "\n", "ax.set_xlabel('x')\n", "ax.set_ylabel('y')\n", "ax.legend(loc = 9)\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.10.9" } }, "nbformat": 4, "nbformat_minor": 4 }