{"id":107,"date":"2020-06-04T18:47:33","date_gmt":"2020-06-04T16:47:33","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=107"},"modified":"2020-06-04T18:58:07","modified_gmt":"2020-06-04T16:58:07","slug":"ficheros-csv-lectura","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=107","title":{"rendered":"Ficheros csv (lectura)"},"content":{"rendered":"\n<p>Los archivos csv (<strong>comma separatted values<\/strong>) est\u00e1n compuestos de datos en texto plano al estilo de una tabla. Estos datos est\u00e1n separados por campos y por l\u00edneas. La primera l\u00ednea puede contener los t\u00edtulos de los campos, aunque esto es opcional ya que no existe un est\u00e1ndar. El resto de l\u00edneas contiene los datos que corresponden a estos campos. Estos campos est\u00e1n separados por comas, aunque tambi\u00e9n es posible usar otro car\u00e1cter separador siempre que se mantenga el mismo en todo el fichero.<\/p>\n\n\n\n<p>Por ejemplo, un archivo llamado <strong>perros.csv<\/strong> puede contener algo as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Raza,Tama\u00f1o\nDalmata,Grande\nBasset Hound,Mediano\nBorder Collie,Mediano\nGalgo Saluki,Grande\nHusky Siberiano,Grande\nCaniche,Peque\u00f1o<\/code><\/pre>\n\n\n\n<p>Es algo parecido a una hoja de c\u00e1lculo en la que cada l\u00ednea representa las filas de la tabla y cada campo las columnas de la misma.<\/p>\n\n\n\n<p>Python puede tratar los archivos csv gracias al m\u00f3dulo csv. Para hacer uso de este m\u00f3dulo es necesario que lo importemos desde nuestro c\u00f3digo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import csv<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">reader<\/h3>\n\n\n\n<p>Para leer estos ficheros se debe crear primero un objeto <strong>reader<\/strong> que permita recorrer las l\u00edneas de los datos del fichero csv.<\/p>\n\n\n\n<p>El siguiente ejemplo importa el m\u00f3dulo csv, abre el archivo perros.csv y asigna a la variable <strong>fichero<\/strong> el manejador correspondiente. Luego utiliza el m\u00e9todo <strong>reader<\/strong> del m\u00f3dulo <strong>csv<\/strong> para convertir datos en un objeto lector con todos los datos del fichero. Finalmente convierte ese objeto en una lista y la muestra en pantalla.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import csv\nfichero = open('perros.csv')\ndatos = csv.reader(fichero)\nlista = list(datos)\nprint(lista)<\/code><\/pre>\n\n\n\n<p>El resultado de ejecutar el script es el siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">python lectorcsv.py\n[['Raza', 'Tama\u00f1o'], ['Dalmata', 'Grande'], ['Basset Hound', 'Mediano'], ['Border Collie', 'Mediano'], ['Galgo Saluki', 'Grande'], ['Husky Siberiano', 'Grande'], ['Caniche', 'Peque\u00f1o']]<\/code><\/pre>\n\n\n\n<p>Se ha convertido en una lista multidimensional que contiene los t\u00edtulos de los campos en el primer elemento y el resto de datos en los siguientes elementos. Se puede recorrer la lista usando su \u00edndice. Por ejemplo el elemento que contiene los t\u00edtulos est\u00e1 en el \u00edndice 0.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">print(lista[0])<\/code><\/pre>\n\n\n\n<p>El t\u00edtulo del primer campo se muestra accediendo a la primera posici\u00f3n del primer elemento de la lista:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">print(lista[0][0])<\/code><\/pre>\n\n\n\n<p>Y el segundo t\u00edtulo se muestra accediendo a la segunda posici\u00f3n del primer elemento de la lista.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">print(lista[0][1])<\/code><\/pre>\n\n\n\n<p>Otra forma de conseguir esto sin convertir el reader en una lista es recorrerlo con un bucle for in. Por ejemplo, el siguiente c\u00f3digo, lee el fichero, l\u00ednea por l\u00ednea y muestra el n\u00famero de l\u00ednea y su contenido.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import csv\nfichero = open('perros.csv')\ndatos = csv.reader(fichero)\nfor registro in datos:\n    print('L\u00ednea: %s -> %s' %(str(datos.line_num),str(registro)))<\/code><\/pre>\n\n\n\n<p>Un elemento a tener en cuenta es la diferencia de acceso entre el objeto reader actual y el acceso a los elementos de la lista del ejemplo anterior. El objeto reader numera los elementos comenzando con el n\u00famero 1, mientras que el primer elemento de una lista es el elemento 0. El resultado de ejecutar este c\u00f3digo es este:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">L\u00ednea: 1 -> ['Raza', 'Tama\u00f1o']\nL\u00ednea: 2 -> ['Dalmata', 'Grande']\nL\u00ednea: 3 -> ['Basset Hound', 'Mediano']\nL\u00ednea: 4 -> ['Border Collie', 'Mediano']\nL\u00ednea: 5 -> ['Galgo Saluki', 'Grande']\nL\u00ednea: 6 -> ['Husky Siberiano', 'Grande']\nL\u00ednea: 7 -> ['Caniche', 'Peque\u00f1o']<\/code><\/pre>\n\n\n\n<p>Pero que ocurre si el fichero csv estuviera delimitado con un car\u00e1cter diferente a la coma. En ese caso solo hay que indicar al reader que el delimitador es diferente y el resto de c\u00f3digo sigue igual. Para eso se usa el argumento <strong>delimiter = &#8216;caracter_delimitador&#8217;<\/strong><\/p>\n\n\n\n<p>En el siguiente ejemplo el archivo <strong>perros2.csv<\/strong> contiene los siguientes datos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Raza;Tama\u00f1o\nDalmata;Grande\nBasset Hound;Mediano\nBorder Collie;Mediano\nGalgo Saluki;Grande\nHusky Siberiano;Grande\nCaniche;Peque\u00f1o<\/code><\/pre>\n\n\n\n<p>Y la lectura y muestra de su contenido se realiza con el siguiente c\u00f3digo, en el que se ha incluido <strong>delimiter=&#8217;;&#8217;<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import csv\nfichero = open('perros2.csv')\ndatos = csv.reader(fichero, delimiter=';')\nfor registro in datos:\n    print('L\u00ednea: %s -> %s' %(str(datos.line_num),str(registro)))<\/code><\/pre>\n\n\n\n<p>Otro argumento interesante puede ser <strong>dialect<\/strong>, el cual intenta estandarizar el objeto csv, puede usarse con los valores: excel, excel-tab y unix. Este argumento le \u00edndica al lector csv que delimitador, car\u00e1cter de escape, terminador de l\u00ednea, etc, usar\u00e1.<\/p>\n\n\n\n<p>El siguiente ejemplo usa los dialectos de csv y muestra su parametrizaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import csv\nfichero = open('perros2.csv')\nprint(csv.list_dialects())\nfor dialecto in csv.list_dialects():\n    print('Configuraci\u00f3n para el dialecto: %s' % dialecto)\n    pd = csv.get_dialect(dialecto)\n    print('Delimitador %s' % pd.delimiter)\n    print('Doble comilla %s' % pd.doublequote)\n    print('Car\u00e1cter de escape %s' % pd.escapechar)\n    print('Fin de l\u00ednea %s' % pd.lineterminator)\n    print('Car\u00e1cter de cita %s' % pd.quotechar)\n    print('Citar %s' % pd.quoting)\n    print('Saltar espacio inicial %s' % pd.skipinitialspace)\n    print('Estricto %s' % pd.strict)<\/code><\/pre>\n\n\n\n<p>El resultado debe de ser algo parecido a esto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">['excel', 'excel-tab', 'unix']\nConfiguraci\u00f3n para el dialecto: excel\nDelimitador ,\nDoble comilla True\nCar\u00e1cter de escape None\nFin de l\u00ednea \n\nCar\u00e1cter de cita \"\nCitar 0\nSaltar espacio inicial False\nEstricto False\nConfiguraci\u00f3n para el dialecto: excel-tab\nDelimitador \t\nDoble comilla True\nCar\u00e1cter de escape None\nFin de l\u00ednea \n\nCar\u00e1cter de cita \"\nCitar 0\nSaltar espacio inicial False\nEstricto False\nConfiguraci\u00f3n para el dialecto: unix\nDelimitador ,\nDoble comilla True\nCar\u00e1cter de escape None\nFin de l\u00ednea \n\nCar\u00e1cter de cita \"\nCitar 1\nSaltar espacio inicial False\nEstricto False<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">DictReader<\/h3>\n\n\n\n<p>El objeto <strong>DictReader<\/strong> ofrece una forma mas interesante de trabajar con los ficheros csv ya que mapea el contenido del archivo csv a un diccionario Python usando la primera l\u00ednea para obtener los t\u00edtulos.<\/p>\n\n\n\n<p>El diccionario se puede recorrer usando el t\u00edtulo como \u00edndice, tal como se muestra en el siguiente ejemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import csv\nfichero = open('perros.csv')\nlector = csv.DictReader(fichero)\nfor fila in lector:\n    print('%s %s' %(fila['Raza'],fila['Tama\u00f1o']))<\/code><\/pre>\n\n\n\n<p>Que mostrar\u00eda los siguientes datos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Dalmata Grande\nBasset Hound Mediano\nBorder Collie Mediano\nGalgo Saluki Grande\nHusky Siberiano Grande\nCaniche Peque\u00f1o<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Los archivos csv (comma separatted values) est\u00e1n compuestos de datos en texto plano al estilo de una tabla. Estos datos &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[51,4],"tags":[52,34,2,6],"class_list":["post-107","post","type-post","status-publish","format-standard","hentry","category-csv","category-python","tag-csv","tag-ficheros","tag-python","tag-python3"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/107","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=107"}],"version-history":[{"count":4,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/107\/revisions"}],"predecessor-version":[{"id":111,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/107\/revisions\/111"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}