{"id":4555,"date":"2015-04-19T23:26:36","date_gmt":"2015-04-19T15:26:36","guid":{"rendered":"http:\/\/rmohan.com\/?p=4555"},"modified":"2015-04-19T23:37:29","modified_gmt":"2015-04-19T15:37:29","slug":"python-if-statement","status":"publish","type":"post","link":"https:\/\/mohan.sg\/?p=4555","title":{"rendered":"Python file and DIRECTORY"},"content":{"rendered":"<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"kwd\">import<\/span><span class=\"pln\"> os\r\n<\/span><span class=\"kwd\">import<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">path\r\n\r\nPATH<\/span><span class=\"pun\">=<\/span><span class=\"str\">'.\/file.txt'<\/span>\r\n\r\n<span class=\"kwd\">if<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">path<\/span><span class=\"pun\">.<\/span><span class=\"pln\">isfile<\/span><span class=\"pun\">(<\/span><span class=\"pln\">PATH<\/span><span class=\"pun\">)<\/span> <span class=\"kwd\">and<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">access<\/span><span class=\"pun\">(<\/span><span class=\"pln\">PATH<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">R_OK<\/span><span class=\"pun\">):<\/span>\r\n    <span class=\"kwd\">print<\/span> <span class=\"str\">\"File exists and is readable\"<\/span>\r\n<span class=\"kwd\">else<\/span><span class=\"pun\">:<\/span>\r\n    <span class=\"kwd\">print<\/span> <span class=\"str\">\"Either file is missing or is not readable\"\r\n\r\n\r\n<\/span><\/code><\/pre>\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"kwd\">import<\/span><span class=\"pln\"> os\r\nfname <\/span><span class=\"pun\">=<\/span> <span class=\"str\">\"foo.txt\"<\/span>\r\n<span class=\"kwd\">if<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">path<\/span><span class=\"pun\">.<\/span><span class=\"pln\">isfile<\/span><span class=\"pun\">(<\/span><span class=\"pln\">fname<\/span><span class=\"pun\">):<\/span>\r\n    <span class=\"kwd\">print<\/span> <span class=\"str\">\"file does exist at this time\"<\/span>\r\n<span class=\"kwd\">else<\/span><span class=\"pun\">:<\/span>\r\n    <span class=\"kwd\">print<\/span> <span class=\"str\">\"no such file\"<\/span><\/code><\/pre>\n<ol>\n<li>Try opening the file:Opening the file will always verify the existence of the file. You can make a function just like so:\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"kwd\">def<\/span> <span class=\"typ\">File_Existence<\/span><span class=\"pun\">(<\/span><span class=\"pln\">filepath<\/span><span class=\"pun\">):<\/span><span class=\"pln\">\r\n    f <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> open<\/span><span class=\"pun\">(<\/span><span class=\"pln\">filepath<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"kwd\">return<\/span> <span class=\"kwd\">True<\/span> <\/code><\/pre>\n<p>If it&#8217;s False, it will stop execution with an unhanded IOError or OSError in later versions of python. To catch the exception, you have to use a try except clause. Of course, you can always use a<span class=\"Apple-converted-space\">\u00a0<\/span><code>try<\/code><span class=\"Apple-converted-space\">\u00a0<\/span><code>except<\/code><span class=\"Apple-converted-space\">\u00a0<\/span>statement like so (Thanks to<span class=\"Apple-converted-space\">\u00a0<\/span><a href=\"http:\/\/stackoverflow.com\/users\/3256073\/hsandt\">hsandt<\/a><span class=\"Apple-converted-space\">\u00a0<\/span>for making me think):<\/p>\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"kwd\">def<\/span> <span class=\"typ\">File_Existence<\/span><span class=\"pun\">(<\/span><span class=\"pln\">filepath<\/span><span class=\"pun\">):<\/span>\r\n    <span class=\"kwd\">try<\/span><span class=\"pun\">:<\/span><span class=\"pln\">\r\n        f <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> open<\/span><span class=\"pun\">(<\/span><span class=\"pln\">filepath<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"kwd\">except<\/span> <span class=\"typ\">IOError<\/span><span class=\"pun\">,<\/span> <span class=\"typ\">OSError<\/span><span class=\"pun\">:<\/span> <span class=\"com\"># Note OSError is for later versions of python<\/span>\r\n        <span class=\"kwd\">return<\/span> <span class=\"kwd\">False<\/span>\r\n\r\n    <span class=\"kwd\">return<\/span> <span class=\"kwd\">True<\/span><\/code><\/pre>\n<\/li>\n<li>Use<span class=\"Apple-converted-space\">\u00a0<\/span><code>os.path.exists(path)<\/code>:This will check the existence of what you specify. However, it checks for files<span class=\"Apple-converted-space\">\u00a0<\/span><em>and<\/em><span class=\"Apple-converted-space\">\u00a0<\/span>directories so beware about how you use it.\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"kwd\">import<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">path\r\n<\/span><span class=\"pun\">&gt;&gt;&gt;<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">path<\/span><span class=\"pun\">.<\/span><span class=\"pln\">exists<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"this\/is\/a\/directory\"<\/span><span class=\"pun\">)<\/span>\r\n<span class=\"kwd\">True<\/span>\r\n<span class=\"pun\">&gt;&gt;&gt;<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">path<\/span><span class=\"pun\">.<\/span><span class=\"pln\">exists<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"this\/is\/a\/file.txt\"<\/span><span class=\"pun\">)<\/span>\r\n<span class=\"kwd\">True<\/span>\r\n<span class=\"pun\">&gt;&gt;&gt;<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">path<\/span><span class=\"pun\">.<\/span><span class=\"pln\">exists<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"not\/a\/directory\"<\/span><span class=\"pun\">)<\/span>\r\n<span class=\"kwd\">False<\/span><\/code><\/pre>\n<\/li>\n<li>Use<span class=\"Apple-converted-space\">\u00a0<\/span><code>os.access(path, mode)<\/code>:This will check whether you have access to the file. It will check for permissions. Based on the os.py documentation, typing in<span class=\"Apple-converted-space\">\u00a0<\/span><code>os.F_OK<\/code>, will check the existence of the path. However, using this will create a security hole, as someone can attack your file using the time between checking the permissions and opening the file. You should instead go directly to opening the file instead of checking its permissions. (<a href=\"https:\/\/docs.python.org\/2\/glossary.html#term-eafp\" rel=\"nofollow\">EAFP<\/a><span class=\"Apple-converted-space\">\u00a0<\/span>vs<span class=\"Apple-converted-space\">\u00a0<\/span><a href=\"https:\/\/docs.python.org\/2\/glossary.html#term-lbyl\" rel=\"nofollow\">LBYP<\/a>). If you&#8217;re not going to open the file afterwards, and only checking its existence, then you can use this.Anyways, here:\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"pun\">&gt;&gt;&gt;<\/span> <span class=\"kwd\">import<\/span><span class=\"pln\"> os\r\n<\/span><span class=\"pun\">&gt;&gt;&gt;<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">access<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"\/is\/a\/file.txt\"<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">F_OK<\/span><span class=\"pun\">)<\/span>\r\n<span class=\"kwd\">True<\/span><\/code><\/pre>\n<\/li>\n<\/ol>\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"str\">\u00a0\r\n\r\n\r\nDirectory \r\n\r\n\r\n\r\n<\/span><\/code><\/pre>\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"kwd\">import<\/span><span class=\"pln\"> os\r\n<\/span><span class=\"kwd\">print<\/span><span class=\"pun\">(<\/span><span class=\"pln\">os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">path<\/span><span class=\"pun\">.<\/span><span class=\"pln\">isdir<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"\/home\/el\"<\/span><span class=\"pun\">))<\/span>\r\n<span class=\"kwd\">print<\/span><span class=\"pun\">(<\/span><span class=\"pln\">os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">path<\/span><span class=\"pun\">.<\/span><span class=\"pln\">exists<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"\/home\/el\/myfile.txt\"<\/span><span class=\"pun\">))\r\n\r\n<\/span><\/code><\/pre>\n<p>os provides you with a lot of these capabilities:<\/p>\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"kwd\">import<\/span><span class=\"pln\"> os\r\nos<\/span><span class=\"pun\">.<\/span><span class=\"pln\">path<\/span><span class=\"pun\">.<\/span><span class=\"pln\">isdir<\/span><span class=\"pun\">(<\/span><span class=\"pln\">dir_in<\/span><span class=\"pun\">)<\/span> <span class=\"com\">#True\/False: check if this is a directory<\/span><span class=\"pln\">\r\nos<\/span><span class=\"pun\">.<\/span><span class=\"pln\">listdir<\/span><span class=\"pun\">(<\/span><span class=\"pln\">dir_in<\/span><span class=\"pun\">)<\/span>    <span class=\"com\">#gets you a list of all files and directories under dir_in<\/span><\/code><\/pre>\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"pun\">\u00a0<\/span><\/code><\/pre>\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"str\">\u00a0\r\n\r\nMake directory on python \r\n\r\n<\/span><\/code><\/pre>\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"kwd\">import<\/span><span class=\"pln\"> os\r\n\r\ndirname <\/span><span class=\"pun\">=<\/span> <span class=\"str\">'create\/me'<\/span>\r\n\r\n<span class=\"kwd\">try<\/span><span class=\"pun\">:<\/span><span class=\"pln\">\r\n    os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">makedirs<\/span><span class=\"pun\">(<\/span><span class=\"pln\">dirname<\/span><span class=\"pun\">)<\/span>\r\n<span class=\"kwd\">except<\/span> <span class=\"typ\">OSError<\/span><span class=\"pun\">:<\/span>\r\n    <span class=\"kwd\">if<\/span><span class=\"pln\"> os<\/span><span class=\"pun\">.<\/span><span class=\"pln\">path<\/span><span class=\"pun\">.<\/span><span class=\"pln\">exists<\/span><span class=\"pun\">(<\/span><span class=\"pln\">dirname<\/span><span class=\"pun\">):<\/span>\r\n        <span class=\"com\"># We are nearly safe<\/span>\r\n        <span class=\"kwd\">pass<\/span>\r\n    <span class=\"kwd\">else<\/span><span class=\"pun\">:<\/span>\r\n        <span class=\"com\"># There was an error on creation, so make sure we know about it<\/span>\r\n        <span class=\"kwd\">raise<\/span><\/code><\/pre>\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"str\">\u00a0\r\n\r\n<\/span><\/code><\/pre>\n<header>\n<h1 class=\"entry-title\">How To Check If A File Exists<\/h1>\n<\/header>\n<div class=\"entry-content\">\n<p>If you find yourself doing any kind of disk-based I\/O with Python, you&#8217;ll undoubtedly come across the need to verify that a file exists before continuing to read\/write against it. There are multiple ways to do this but also some things you should watch for.<\/p>\n<p>You may initially discover the<span class=\"Apple-converted-space\">\u00a0<\/span><strong>os.path.exists()<\/strong><span class=\"Apple-converted-space\">\u00a0<\/span>method, but keep in mind that this will yield True for both files<span class=\"Apple-converted-space\">\u00a0<\/span><em>and<\/em><span class=\"Apple-converted-space\">\u00a0<\/span>directories. This lack of specificity could easily introduce bugs and data loss if not expected.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"c\">#Returns true for directories, not just files<\/span>\r\n<span class=\"o\">&gt;&gt;&gt;<\/span> <span class=\"k\">print<\/span> <span class=\"n\">os<\/span><span class=\"o\">.<\/span><span class=\"n\">path<\/span><span class=\"o\">.<\/span><span class=\"n\">exists<\/span><span class=\"p\">(<\/span><span class=\"s\">'\/this\/is\/a\/dir'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"bp\">True<\/span>\r\n<\/pre>\n<\/div>\n<p>If you want to zero-in on just files, stick to<span class=\"Apple-converted-space\">\u00a0<\/span><strong>os.path.isfile()<\/strong><span class=\"Apple-converted-space\">\u00a0<\/span>method. Remember that something could happen to a file in the time between checking that it exists and actually preforming read\/write operations against it. This approach will not lock the file in any way and therefore your code can become vulnerable to &#8220;time of check to time of use&#8221; (TOCTTOU) bugs.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"c\">#Returns true for directories, not just files<\/span>\r\n<span class=\"k\">if<\/span> <span class=\"n\">os<\/span><span class=\"o\">.<\/span><span class=\"n\">path<\/span><span class=\"o\">.<\/span><span class=\"n\">isfile<\/span><span class=\"p\">(<\/span><span class=\"s\">'my_settings.dat'<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"c\">#...<\/span>\r\n    <span class=\"k\">with<\/span> <span class=\"nb\">open<\/span><span class=\"p\">(<\/span><span class=\"s\">'my_settings.dat'<\/span><span class=\"p\">)<\/span> <span class=\"k\">as<\/span> <span class=\"nb\">file<\/span><span class=\"p\">:<\/span>\r\n       <span class=\"k\">pass<\/span>  <span class=\"c\">#Potential for unhandled exception<\/span>\r\n<span class=\"bp\">True<\/span>\r\n<\/pre>\n<\/div>\n<p>Yes, that&#8217;s a real thing.<span class=\"Apple-converted-space\">\u00a0<\/span><a href=\"http:\/\/en.wikipedia.org\/wiki\/Time-of-check-to-time-of-use\">Wikipedia has an article on TOCTTOU bugs<\/a>, along with an example of how symlinks can be used by an attacker. I encourage you to read it.<\/p>\n<p>Raising exceptions is considered to be an acceptable, and Pythonic, approach for flow control in your program. Consider handling missing files with IOErrors, rather than<span class=\"Apple-converted-space\">\u00a0<\/span><em>if<\/em><span class=\"Apple-converted-space\">\u00a0<\/span>statements. In this situation, an IOError exception will be raised if the file exists but the user does not have read permissions.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"k\">with<\/span> <span class=\"nb\">open<\/span><span class=\"p\">(<\/span><span class=\"s\">'my_settings.dat'<\/span><span class=\"p\">)<\/span> <span class=\"k\">as<\/span> <span class=\"nb\">file<\/span><span class=\"p\">:<\/span>\r\n        <span class=\"k\">pass<\/span>\r\n<span class=\"k\">except<\/span> <span class=\"ne\">IOError<\/span> <span class=\"k\">as<\/span> <span class=\"n\">e<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"k\">print<\/span> <span class=\"s\">\"Unable to open file\"<\/span> <span class=\"c\">#Does not exist OR no read permissions<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<pre class=\"lang-py prettyprint prettyprinted\"><code><span class=\"str\"><br class=\"Apple-interchange-newline\" \/>\r\n<\/span><\/code><\/pre>\n<h2>Check If a File Exists and Then Delete It in Python<\/h2>\n<pre class=\"python\">\u00a0\r\n#!\/usr\/bin\/python\r\nimport os\r\n\u00a0\r\n## get input ##\r\nfilename=raw_input(\"Type file name to remove: \")\r\n\u00a0\r\n## delete only if file exists ##\r\nif os.path.exists(filename):\r\n    os.remove(filename)\r\nelse:\r\n    print(\"Sorry, I can not remove %s file.\" % filename)\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>A Better Option To Delete A File In Python<\/h2>\n<p>The following code gives an error information when it can not delete the given file name:<\/p>\n<pre class=\"python\">\u00a0\r\n#!\/usr\/bin\/python\r\nimport os\r\n\u00a0\r\n## get input ##\r\nfilename=raw_input(\"Type file name to remove: \")\r\n\u00a0\r\n## check if a file exists on disk ##\r\n## if exists, delete it else show message on screen ##\r\nif os.path.exists(filename):\r\n\ttry:\r\n\t\tos.remove(filename)\r\n\texcept OSError, e:\r\n\t\tprint (\"Error: %s - %s.\" % (e.filename,e.strerror))\r\nelse:\r\n\tprint(\"Sorry, I can not find %s file.\" % filename)\r\n<\/pre>\n<p>Sample outputs:<\/p>\n","protected":false},"excerpt":{"rendered":"<p>import os import os.path PATH=&#8217;.\/file.txt&#8217; if os.path.isfile(PATH) and os.access(PATH, os.R_OK): print &#8220;File exists and is readable&#8221; else: print &#8220;Either file is missing or is not readable&#8221; import os fname = &#8220;foo.txt&#8221; if os.path.isfile(fname): print &#8220;file does exist at this time&#8221; else: print &#8220;no such file&#8221; Try opening the file:Opening the file will always verify the [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[74],"tags":[],"_links":{"self":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts\/4555"}],"collection":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4555"}],"version-history":[{"count":7,"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts\/4555\/revisions"}],"predecessor-version":[{"id":4562,"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts\/4555\/revisions\/4562"}],"wp:attachment":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4555"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4555"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}