<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>File | Haobin Tan</title><link>https://haobin-tan.netlify.app/tags/file/</link><atom:link href="https://haobin-tan.netlify.app/tags/file/index.xml" rel="self" type="application/rss+xml"/><description>File</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Sat, 26 Dec 2020 00:00:00 +0000</lastBuildDate><image><url>https://haobin-tan.netlify.app/media/icon_hu7d15bc7db65c8eaf7a4f66f5447d0b42_15095_512x512_fill_lanczos_center_3.png</url><title>File</title><link>https://haobin-tan.netlify.app/tags/file/</link></image><item><title>Working with Files</title><link>https://haobin-tan.netlify.app/docs/coding/python/files/file/</link><pubDate>Thu, 19 Nov 2020 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/coding/python/files/file/</guid><description>&lt;h2 id="with-open-as--pattern">&lt;code>with open(...) as ...&lt;/code> pattern&lt;/h2>
&lt;ol>
&lt;li>&lt;code>open()&lt;/code> opens file for reading or writing and returns a file handle&lt;/li>
&lt;li>Use appropriate methods to read or write this file handel&lt;/li>
&lt;/ol>
&lt;p>Example&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Read&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;data.txt&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;r&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Write&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;data.txt&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;w&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;some data to be written to the file&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h2 id="directory-listing">Directory listing&lt;/h2>
&lt;h3 id="directory-listing-in-legacy-python-versions">Directory Listing in Legacy Python Versions&lt;/h3>
&lt;p>&lt;code>os.listdir()&lt;/code>&lt;/p>
&lt;ul>
&lt;li>returns a Python list containing the names of the files and subdirectories in the directory given by the path argument:&lt;/li>
&lt;/ul>
&lt;p>Example&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">entries&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;my_directory/&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="directory-listing-in-modern-python-versions">Directory Listing in Modern Python Versions&lt;/h3>
&lt;h4 id="osscandir">&lt;code>os.scandir()&lt;/code>&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>returns an iterator&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">ROOT&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;my_directory/&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">entries&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">scandir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ROOT&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">entries&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">&amp;lt;posix.ScandirIterator at 0x7f6db713c3f0&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>The &lt;code>ScandirIterator&lt;/code> points to all the entries in the current directory. You can loop over the contents of the iterator and print out the filenames:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">with&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">scandir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ROOT&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">entries&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">entry&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">entries&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s1">10&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h4 id="pathlib-module">&lt;code>pathlib&lt;/code> module&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>&lt;code>pathlib.Path()&lt;/code> objects have an &lt;code>.iterdir()&lt;/code> method for creating an iterator of all files and folders in a directory. Each entry yielded by &lt;code>.iterdir()&lt;/code> contains information about the file or directory such as its name and file attributes.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>pathlib&lt;/code> offers a set of classes featuring most of the common operations on paths in an easy, object-oriented way. Another benefit of using pathlib over os is that it reduces the number of imports you need to make to manipulate filesystem paths. &amp;#x1f44f;&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Example&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">entries&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ROOT&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">entry&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">entries&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">iterdir&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">, name: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stem&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">, ext: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">suffix&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="summary">Summary&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Function&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>os.listdir()&lt;/code>&lt;/td>
&lt;td>Returns a list of all files and folders in a directory&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>os.scandir()&lt;/code>&lt;/td>
&lt;td>Returns an iterator of all the objects in a directory including file attribute information&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pathlib.Path.iterdir()&lt;/code>&lt;/td>
&lt;td>Returns an iterator of all the objects in a directory including file attribute information&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="listing-all-files-in-a-directory">Listing all files in a directory&lt;/h3>
&lt;p>Filter out directories and only list files from a directory listing&lt;/p>
&lt;h4 id="use-oslistdir">Use &lt;code>os.listdir()&lt;/code>&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">basepath&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;my_directory&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">entry&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">basepath&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">basepath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">entry&lt;/span>&lt;span class="p">)):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">entry&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="use-osscandir">Use &lt;code>os.scandir()&lt;/code>&lt;/h4>
&lt;p>Using &lt;code>os.scandir()&lt;/code> has the advantage of looking cleaner and being easier to understand than using &lt;code>os.listdir()&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">basepath&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;my_directory&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">with&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">scandir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">basepath&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">entries&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">entry&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">entries&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">is_file&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="use-pathlibpath">Use &lt;code>pathlib.Path()&lt;/code>&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">basepath&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;my_directory&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">files_in_basepath&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">basepath&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">iterdir&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">files_in_basepath&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">is_file&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The code above can be made more concise if we combine the &lt;code>for&lt;/code> loop and the &lt;code>if&lt;/code> statement into a single generator expression&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">basepath&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;my_directory&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">files_in_basepath&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">entry&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">entry&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">basepath&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">iterdir&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">is_file&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">files_in_basepath&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="listing-subdirectories">Listing subdirectories&lt;/h3>
&lt;h4 id="use-oslistdir-and">Use &lt;code>os.listdir()&lt;/code> and&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">basepath&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;my_directory&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sub_dirs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">entry&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">entry&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">basepath&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">basepath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">entry&lt;/span>&lt;span class="p">)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">sub_dir&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">sub_dirs&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sub_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="use-osscandir-1">Use &lt;code>os.scandir()&lt;/code>&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">basepath&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;my_directory&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">with&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">scandir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">basepath&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">entries&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">entry&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">entries&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">is_dir&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="use-pathlibpath-1">Use &lt;code>pathlib.Path&lt;/code>&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">basepath&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;my_directory&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sub_dirs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">item&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">basepath&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">iterdir&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">is_dir&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">sub_dir&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">sub_dirs&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sub_dir&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="making-directories">Making directories&lt;/h2>
&lt;p>&lt;code>os&lt;/code> and &lt;code>pathlib&lt;/code> include functions for creating directories. We’ll consider these:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Function&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>os.mkdir()&lt;/code>&lt;/td>
&lt;td>Creates a single subdirectory&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pathlib.Path.mkdir()&lt;/code>&lt;/td>
&lt;td>Creates single or multiple directories&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>os.makedirs()&lt;/code>&lt;/td>
&lt;td>Creates multiple directories, including intermediate directories&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="making-single-directories">Making single directories&lt;/h3>
&lt;h4 id="use-osmkdir">Use &lt;code>os.mkdir()&lt;/code>&lt;/h4>
&lt;p>To create a single directory, pass a path to the directory as a parameter to &lt;code>os.mkdir()&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mkdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;example_directory/&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note: If a directory already exists, &lt;code>os.mkdir()&lt;/code> raises &lt;code>FileExistsError&lt;/code>.&lt;/p>
&lt;h4 id="use-pathlib">Use &lt;code>pathlib&lt;/code>&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;example_directory/&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mkdir&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If the path already exists, &lt;code>Path.mkdir()&lt;/code> raises a &lt;code>FileExistsError&lt;/code>.&lt;/p>
&lt;p>To avoid the error, catch the error when it happens and let the user know:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;example_directory/&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">p&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mkdir&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">except&lt;/span> &lt;span class="ne">FileExistsError&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">err&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">err&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Alternatively, you can ignore the &lt;code>FileExistsError&lt;/code> by passing the &lt;code>exist_ok=True&lt;/code> argument to &lt;code>.mkdir()&lt;/code>. This will not raise an error if the directory already exists.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;example_directory/&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mkdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">exist_ok&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="creating-multiple-directories">Creating Multiple Directories&lt;/h3>
&lt;h4 id="use-osmakedirs">Use &lt;code>os.makedirs&lt;/code>&lt;/h4>
&lt;p>&lt;code>os.makedirs()&lt;/code>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>similar to &lt;code>os.mkdir()&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The difference between the two is that not only can &lt;code>os.makedirs()&lt;/code> create individual directories, it can also be used to create directory trees. In other words, it can create any necessary intermediate folders in order to ensure a full path exists.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>similar to running &lt;code>mkdir -p&lt;/code> in Bash.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;dir/sub_dir/sub_sub_dir&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will create a nested directories with default permissions:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">|
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── dir/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── sub_dir/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── sub_sub_dir/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="use-pathlibpath-2">Use &lt;code>pathlib.Path&lt;/code>&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pathlib&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pathlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;dir/sub_dir/sub_sub_dir&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mkdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">parents&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">exist_ok&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>I prefer using &lt;code>pathlib&lt;/code> when creating directories because I can use the same function to create single or nested directories.&lt;/strong>&lt;/p>
&lt;h2 id="filename-pattern-matching">Filename Pattern Matching&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Function&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>startswith()&lt;/code>&lt;/td>
&lt;td>Tests if a string starts with a specified pattern and returns &lt;code>True&lt;/code>or &lt;code>False&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>endswith()&lt;/code>&lt;/td>
&lt;td>Tests if a string ends with a specified pattern and returns &lt;code>True&lt;/code> or &lt;code>False&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>fnmatch.fnmatch(filename, pattern)&lt;/code>&lt;/td>
&lt;td>Tests whether the filename matches the pattern and returns &lt;code>True&lt;/code> or &lt;code>False&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>glob.glob()&lt;/code>&lt;/td>
&lt;td>Returns a list of filenames that match a pattern&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pathlib.Path.glob()&lt;/code>&lt;/td>
&lt;td>Finds patterns in path names and returns a generator object&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="traversing-directories-and-processing-files">Traversing Directories and Processing Files&lt;/h2>
&lt;h3 id="oswalk">&lt;code>os.walk()&lt;/code>&lt;/h3>
&lt;p>&lt;code>os.walk()&lt;/code> defaults to traversing directories in a top-down manner.&lt;/p>
&lt;ul>
&lt;li>To traverse the directory tree in a bottom-up manner, pass in a &lt;code>topdown=False&lt;/code> keyword argument&lt;/li>
&lt;/ul>
&lt;p>&lt;code>os.walk()&lt;/code> returns three values on each iteration of the loop:&lt;/p>
&lt;ol>
&lt;li>The name of the current folder&lt;/li>
&lt;li>A list of folders in the current folder&lt;/li>
&lt;li>A list of files in the current folder&lt;/li>
&lt;/ol>
&lt;h2 id="deleting-files">Deleting files&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Function&lt;/th>
&lt;th>Note&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>os.remove()&lt;/code>&lt;/td>
&lt;td>Will throw an &lt;code>OSError&lt;/code> if the path passed to them points to a directory instead of a file&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>os.unlink()&lt;/code>&lt;/td>
&lt;td>&lt;li> semantically identical to &lt;code>os.remove()&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pathlib.Path.unlink()&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="deleting-directories">Deleting Directories&lt;/h2>
&lt;h3 id="delete-single-directory">Delete single directory&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Function&lt;/th>
&lt;th>Note&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>os.rmdir()&lt;/code>&lt;/td>
&lt;td>Only work if the directory you’re trying to delete is empty. If the directory isn’t empty, an &lt;code>OSError&lt;/code> is raised.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pathlib.rmdir()&lt;/code>&lt;/td>
&lt;td>&lt;li> semantically identical to &lt;code>os.rmdir()&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="delete-entire-directory-trees">Delete entire directory trees&lt;/h3>
&lt;p>&lt;code>shutil.rmtree(dir)&lt;/code>: Everything in &lt;code>dir&lt;/code> is deleted when &lt;code>shutil.rmtree()&lt;/code> is called on it.&lt;/p>
&lt;h2 id="summary-for-deleting">Summary for deleting&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Function&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>os.remove()&lt;/code>&lt;/td>
&lt;td>Deletes a file and does not delete directories&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>os.unlink()&lt;/code>&lt;/td>
&lt;td>Is identical to &lt;code>os.remove()&lt;/code> and deletes a single file&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pathlib.Path.unlink()&lt;/code>&lt;/td>
&lt;td>Deletes a file and cannot delete directories&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>os.rmdir()&lt;/code>&lt;/td>
&lt;td>Deletes an empty directory&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pathlib.Path.rmdir()&lt;/code>&lt;/td>
&lt;td>Deletes an empty directory&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>shutil.rmtree()&lt;/code>&lt;/td>
&lt;td>Deletes entire directory tree and can be used to delete non-empty directories&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="copying">Copying&lt;/h2>
&lt;h3 id="copying-files">Copying files&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Function&lt;/th>
&lt;th>Note&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>shutil.copy()&lt;/code>&lt;/td>
&lt;td>&lt;li> comparable to the &lt;code>cp&lt;/code> command in UNIX based systems. &lt;li> &lt;code>shutil.copy(src, dst)&lt;/code> will copy the file &lt;code>src&lt;/code> to the location specified in &lt;code>dst&lt;/code>. If &lt;code>dst&lt;/code>is a file, the contents of that file are replaced with the contents of &lt;code>src&lt;/code>. If &lt;code>dst&lt;/code> is a directory, then &lt;code>src&lt;/code> will be copied into that director &lt;li> &lt;code>shutil.copy()&lt;/code> ONLY copies the file’s contents and the file’s permissions. Other metadata like the file’s creation and modification times are not preserved.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>shutil.copy2()&lt;/code>&lt;/td>
&lt;td>preserve all file metadata when copying&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="copying-directories">Copying directories&lt;/h3>
&lt;p>&lt;code>shutil.copytree()&lt;/code>&lt;/p>
&lt;h2 id="moving-files-and-directories">Moving Files and Directories&lt;/h2>
&lt;p>To move a file or directory to another location, use &lt;code>shutil.move(src, dst)&lt;/code>.&lt;/p>
&lt;ul>
&lt;li>&lt;code>src&lt;/code>: file or directory to be moved&lt;/li>
&lt;li>&lt;code>dst&lt;/code>: destination. If &lt;code>dst&lt;/code> does not exist, &lt;code>src&lt;/code> will be renamed to &lt;code>dst&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="renaming-files-and-directories">Renaming Files and Directories&lt;/h2>
&lt;ul>
&lt;li>&lt;code>os.rename(src, dst)&lt;/code>&lt;/li>
&lt;li>&lt;code>pathlib.Path.rename()&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="colab-notebook">Colab Notebook&lt;/h2>
&lt;p>&lt;a href="https://colab.research.google.com/drive/1ey4Rj0hYx0RDMqxIfB7S0SYstf0Crh2x?authuser=1#scrollTo=m1v51QdqGDYs">Colab Notebook&lt;/a>&lt;/p>
&lt;h2 id="reference">Reference&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://realpython.com/working-with-files-in-python/#an-easier-way-of-creating-archives">Working with Files in Python&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>pathlib</title><link>https://haobin-tan.netlify.app/docs/coding/python/files/pathlib/</link><pubDate>Sat, 26 Dec 2020 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/coding/python/files/pathlib/</guid><description>&lt;h2 id="why-patblib">Why &lt;code>patblib&lt;/code>?&lt;/h2>
&lt;p>The &lt;code>pathlib&lt;/code> module, introduced in Python 3.4 (&lt;a href="https://www.python.org/dev/peps/pep-0428/">PEP 428&lt;/a>), gathers the necessary functionality in one place and makes it available through methods and properties on an easy-to-use &lt;code>Path&lt;/code> object.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="createing-paths">Createing paths&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>Use class methods:&lt;/p>
&lt;ul>
&lt;li>&lt;code>Path.cwd()&lt;/code>: get Current Working Directory&lt;/li>
&lt;li>&lt;code>Path.home()&lt;/code>: get home directory&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Create from string representation explicitly&lt;/p>
&lt;p>E.g.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/content/src/demo.py&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Construct path by joining parts of the path&lt;/p>
&lt;p>E.g.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">joinpath&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cwd&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="s2">&amp;#34;src&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;demo.py&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h2 id="reading-and-writing-files">Reading and writing files&lt;/h2>
&lt;p>The built-in &lt;code>open()&lt;/code> function can use &lt;code>Path&lt;/code> objects directly. E.g.:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mode&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;r&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">pass&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For simple reading and writing of files, there are a couple of convenience methods in the &lt;code>pathlib&lt;/code> library:&lt;/p>
&lt;ul>
&lt;li>&lt;code>.read_text()&lt;/code>: open the path in text mode and return the contents as a string.&lt;/li>
&lt;li>&lt;code>.read_bytes()&lt;/code>: open the path in binary/bytes mode and return the contents as a bytestring.&lt;/li>
&lt;li>&lt;code>.write_text()&lt;/code>: open the path and write string data to it.&lt;/li>
&lt;li>&lt;code>.write_bytes()&lt;/code>: open the path in binary/bytes mode and write data to it.&lt;/li>
&lt;/ul>
&lt;p>Each of these methods handles the opening and closing of the file, making them trivial to use.&lt;/p>
&lt;h2 id="components-of-path">Components of path&lt;/h2>
&lt;p>The different parts of a path are conveniently available as properties. Basic examples include:&lt;/p>
&lt;ul>
&lt;li>&lt;code>.name&lt;/code>: the file name without any directory&lt;/li>
&lt;li>&lt;code>.parent&lt;/code>: the directory containing the file, or the parent directory if path is a directory&lt;/li>
&lt;li>&lt;code>.stem&lt;/code>: the file name without the suffix&lt;/li>
&lt;li>&lt;code>.suffix&lt;/code>: the file extension&lt;/li>
&lt;li>&lt;code>.anchor&lt;/code>: the part of the path before the directories&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">joinpath&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cwd&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="s2">&amp;#34;src&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;hello-world.txt&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Full path: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Name: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Parent: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">parent&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Stem: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stem&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Suffix: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">suffix&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Anchor: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">anchor&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Full path: /content/src/hello-world.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Name: hello-world.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Parent: /content/src
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Stem: hello-world
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Suffix: .txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Anchor: /
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="renaming-files">Renaming files&lt;/h2>
&lt;p>When you are renaming files, useful methods might be &lt;code>.with_name()&lt;/code> and &lt;code>.with_suffix()&lt;/code>. They both return the original path but with the name or the suffix replaced, respectively.&lt;/p>
&lt;h2 id="deleting-files">Deleting files&lt;/h2>
&lt;p>Directories and files can be deleted using &lt;code>.rmdir()&lt;/code> and &lt;code>.unlink()&lt;/code> respectively.&lt;/p>
&lt;h2 id="listing-files">Listing files&lt;/h2>
&lt;ul>
&lt;li>&lt;code>Path.iterdir()&lt;/code> : iterates over all files in the given directory&lt;/li>
&lt;li>More flexible file listing
&lt;ul>
&lt;li>&lt;code>Path.glob()&lt;/code>&lt;/li>
&lt;li>&lt;code>Path.rglob()&lt;/code> (recursive glob)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="moving-files">Moving files&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">current_location&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_location&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="correspondence-to-tools-in-the-oshttpsdocspythonorg3libraryoshtmlmodule-os-module">Correspondence to tools in the &lt;a href="https://docs.python.org/3/library/os.html#module-os">&lt;code>os&lt;/code>&lt;/a> module&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">os and os.path&lt;/th>
&lt;th style="text-align:left">pathlib&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.abspath">&lt;code>os.path.abspath()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.resolve">&lt;code>Path.resolve()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.chmod">&lt;code>os.chmod()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.chmod">&lt;code>Path.chmod()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.mkdir">&lt;code>os.mkdir()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.mkdir">&lt;code>Path.mkdir()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.makedirs">&lt;code>os.makedirs()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.mkdir">&lt;code>Path.mkdir(parents=True)&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.rename">&lt;code>os.rename()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.rename">&lt;code>Path.rename()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.replace">&lt;code>os.replace()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.replace">&lt;code>Path.replace()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.rmdir">&lt;code>os.rmdir()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.rmdir">&lt;code>Path.rmdir()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.remove">&lt;code>os.remove()&lt;/code>&lt;/a>, &lt;a href="https://docs.python.org/3/library/os.html#os.unlink">&lt;code>os.unlink()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.unlink">&lt;code>Path.unlink()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.getcwd">&lt;code>os.getcwd()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.cwd">&lt;code>Path.cwd()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.exists">&lt;code>os.path.exists()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.exists">&lt;code>Path.exists()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.expanduser">&lt;code>os.path.expanduser()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.expanduser">&lt;code>Path.expanduser()&lt;/code>&lt;/a> and &lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.home">&lt;code>Path.home()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.listdir">&lt;code>os.listdir()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.iterdir">&lt;code>Path.iterdir()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.isdir">&lt;code>os.path.isdir()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.is_dir">&lt;code>Path.is_dir()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.isfile">&lt;code>os.path.isfile()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.is_file">&lt;code>Path.is_file()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.islink">&lt;code>os.path.islink()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.is_symlink">&lt;code>Path.is_symlink()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.link">&lt;code>os.link()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.link_to">&lt;code>Path.link_to()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.symlink">&lt;code>os.symlink()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.symlink_to">&lt;code>Path.symlink_to()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.readlink">&lt;code>os.readlink()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.readlink">&lt;code>Path.readlink()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.html#os.stat">&lt;code>os.stat()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.stat">&lt;code>Path.stat()&lt;/code>&lt;/a>, &lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.owner">&lt;code>Path.owner()&lt;/code>&lt;/a>, &lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.group">&lt;code>Path.group()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.isabs">&lt;code>os.path.isabs()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.is_absolute">&lt;code>PurePath.is_absolute()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.join">&lt;code>os.path.join()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.joinpath">&lt;code>PurePath.joinpath()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.basename">&lt;code>os.path.basename()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.name">&lt;code>PurePath.name&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.dirname">&lt;code>os.path.dirname()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.parent">&lt;code>PurePath.parent&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.samefile">&lt;code>os.path.samefile()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.samefile">&lt;code>Path.samefile()&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/os.path.html#os.path.splitext">&lt;code>os.path.splitext()&lt;/code>&lt;/a>&lt;/td>
&lt;td style="text-align:left">&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.suffix">&lt;code>PurePath.suffix&lt;/code>&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="pathlib-cheatsheet">&lt;code>pathlib&lt;/code> cheatsheet&lt;/h2>
&lt;p>&lt;a href="https://github.com/chris1610/pbpython/blob/master/extras/Pathlib-Cheatsheet.pdf">pathlib cheatsheet&lt;/a>&lt;/p>
&lt;h2 id="google-colab-notebook">Google Colab Notebook&lt;/h2>
&lt;p>Open in &lt;a href="https://colab.research.google.com/drive/1jKTOzkIFs1ZSyp3xUXugR1C1-5Lv9mPZ#scrollTo=U-MJKEzD1TeG">Colab&lt;/a>&lt;/p>
&lt;h2 id="reference">Reference&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>Documentation: &lt;a href="https://docs.python.org/3/library/pathlib.html#module-pathlib">&lt;code>pathlib&lt;/code>&lt;/a> — Object-oriented filesystem paths&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://realpython.com/python-pathlib/#the-problem-with-python-file-path-handling">Python 3&amp;rsquo;s pathlib Module: Taming the File System&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul></description></item><item><title>glob</title><link>https://haobin-tan.netlify.app/docs/coding/python/files/py-glob/</link><pubDate>Fri, 25 Dec 2020 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/coding/python/files/py-glob/</guid><description>&lt;p>The &lt;a href="https://docs.python.org/3/library/glob.html#module-glob">&lt;code>glob&lt;/code>&lt;/a> module finds all the pathnames matching a specified pattern according to the rules used by the Unix shell. If you need a list of filenames that all have a certain extension, prefix, or any common string in the middle, use &lt;a href="https://pymotw.com/2/glob/#module-glob">&lt;code>glob&lt;/code>&lt;/a> instead of writing code to scan the directory contents yourself.&lt;/p>
&lt;h2 id="wildcards">Wildcards&lt;/h2>
&lt;ul>
&lt;li>&lt;code>*&lt;/code> : matches &lt;strong>zero or more&lt;/strong> characters in a segment of a name&lt;/li>
&lt;li>&lt;code>?&lt;/code> : matches any &lt;strong>single&lt;/strong> character in that position in the name&lt;/li>
&lt;li>&lt;code>[] &lt;/code>: matches characters in the given range
&lt;ul>
&lt;li>&lt;code>[1-9]&lt;/code> : matches any single digit&lt;/li>
&lt;li>&lt;code>[a-z&lt;/code> : mathces any single letter&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="functions">Functions&lt;/h2>
&lt;h3 id="globglob">&lt;code>glob.glob()&lt;/code>&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">glob&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_pattern&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">recursive&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>It retrieves the list of files matching the specified pattern in the &lt;code>file_pattern &lt;/code>parameter.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>The &lt;code>file_pattern &lt;/code> can be an absolute or relative path. It may also contain wild cards such as &lt;code>*&lt;/code> or &lt;code>?&lt;/code> symbols.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The &lt;code>recursive &lt;/code>parameter is turn off (&lt;code>False&lt;/code>) by default. When &lt;code>True&lt;/code>, it recursively searches files under all subdirectories of the current directory.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>For example, we have file structure like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">- src
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">|- code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- main.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- test0.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- test1.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- test2.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- test-env.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- test-prod.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">|- text
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- file_a.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- file_b.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- file_c.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- file_d.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">|- demo.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We want to get all &lt;code>.py&lt;/code> files:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">glob&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">py_file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">glob&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">glob&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;src/**/*.py&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">recursive&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">py_file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">src/demo.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test1.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test-env.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/main.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test2.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test0.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We want to get &lt;code>test0.py&lt;/code>, &lt;code>test1.py&lt;/code>, &lt;code>test2.py&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">glob&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">py_file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">glob&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">glob&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;src/**/test?.py&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">py_file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">src/code/test1.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test2.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test0.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We want to get &lt;code>file_a.txt&lt;/code>, &lt;code>file_b.txt&lt;/code>, &lt;code>file_c.txt&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">glob&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">txt_file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">glob&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">glob&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;src/**/file_[a-c].txt&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">txt_file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">src/text/file_a.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/text/file_c.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/text/file_b.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="globiglob">&lt;code>glob.iglob()&lt;/code>&lt;/h3>
&lt;p>Return an &lt;a href="https://docs.python.org/3/glossary.html#term-iterator">iterator&lt;/a> which yields the same values as &lt;a href="https://docs.python.org/3/library/glob.html#module-glob">&lt;code>glob()&lt;/code>&lt;/a> without actually storing them all simultaneously (good for large directories).&lt;/p>
&lt;p>Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">glob&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">py_file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">glob&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">iglob&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;src/**/test?.py&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">py_file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">src/code/test1.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test2.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test0.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="globescape">&lt;code>glob.escape()&lt;/code>&lt;/h3>
&lt;p>Escape all special characters (&lt;code>'?'&lt;/code>, &lt;code>'*'&lt;/code> and &lt;code>'['&lt;/code>). &amp;ldquo;Escape&amp;rdquo; means treating special characters as normal character instead of wildcards.&lt;/p>
&lt;p>This is useful if you want to match an arbitrary literal string that may have special characters in it.&lt;/p>
&lt;p>For example, if we want to get &lt;code>test-env.py&lt;/code> and &lt;code>test-prod.py&lt;/code> (both contain special character &lt;code>-&lt;/code> in the filename):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">glob&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">py_file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">glob&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">glob&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;src/code/*&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">glob&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;*.py&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">py_file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="another-ways-for-filename-pattern-matching">Another ways for filename pattern matching&lt;/h2>
&lt;h3 id="fnmatchfnmatch-1">&lt;code>fnmatch.fnmatch()&lt;/code> &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">fnmatch&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fnmatch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pattern&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Test whether the &lt;code>filename&lt;/code> string matches the &lt;code>pattern &lt;/code>string.&lt;/p>
&lt;p>For example, we want to get &lt;code>test0.py&lt;/code>, &lt;code>test1.py&lt;/code>, &lt;code>test2.py&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">fnmatch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">py_file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;src/code&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">fnmatch&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fnmatch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">py_file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;test?.py&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">py_file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="pathlibpathglob-2">&lt;code>pathlib.Path.glob()&lt;/code> &lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">pathlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">glob&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pattern&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Glob the given relative &lt;em>pattern&lt;/em> in the directory represented by this path, yielding all matching files (of any kind).&lt;/p>
&lt;p>For example, if we want to list all python file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;src&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">py_file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">glob&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;**/*.py&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">py_file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">src/demo.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test1.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test-prod.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test-env.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/main.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test2.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test0.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="flex px-4 py-3 mb-6 rounded-md bg-primary-100 dark:bg-primary-900">
&lt;span class="pr-3 pt-1 text-primary-600 dark:text-primary-300">
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m11.25 11.25l.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0a9 9 0 0 1 18 0m-9-3.75h.008v.008H12z"/>&lt;/svg>
&lt;/span>
&lt;span class="dark:text-neutral-300">The “&lt;code>**&lt;/code>” pattern means “this directory and all subdirectories, recursively”. In other words, it enables recursive globbing. However, using the “&lt;code>**&lt;/code>” pattern in large directory trees may consume an inordinate amount of time.&lt;/span>
&lt;/div>
&lt;p>&lt;code>Path.glob()&lt;/code> is similar to &lt;code>os.glob()&lt;/code> discussed above. As you can see, &lt;code>pathlib&lt;/code> combines many of the best features of the &lt;code>os&lt;/code>, &lt;code>os.path&lt;/code>, and &lt;code>glob&lt;/code> modules into one single module, which makes it a joy to use.&lt;/p>
&lt;h4 id="pathlibpathrglob-3">&lt;code>pathlib.Path.rglob()&lt;/code> &lt;sup id="fnref:3">&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref">3&lt;/a>&lt;/sup>&lt;/h4>
&lt;p>This is like calling &lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.glob">&lt;code>Path.glob()&lt;/code>&lt;/a> with “&lt;code>**/&lt;/code>” added in front of the given relative &lt;em>pattern&lt;/em>.&lt;/p>
&lt;p>E.g. list all python file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">py_file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;src&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rglob&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;*.py&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">py_file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">src/demo.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test1.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test-prod.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test-env.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/main.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test2.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">src/code/test0.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="summary">Summary&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Function&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>fnmatch.fnmatch(filename, pattern)&lt;/code>&lt;/td>
&lt;td>Tests whether the filename matches the pattern and returns &lt;code>True&lt;/code> or &lt;code>False&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>glob.glob()&lt;/code>&lt;/td>
&lt;td>Returns a list of filenames that match a pattern&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>glob.iglob()&lt;/code>&lt;/td>
&lt;td>Returns an iterator of filenames that match a pattern&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pathlib.Path.glob()&lt;/code>&lt;/td>
&lt;td>Finds patterns in path names and returns a generator object&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pathlib.Path.rglob()&lt;/code>&lt;/td>
&lt;td>Finds patterns in path names recursively and returns a generator object&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="reference">Reference&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://docs.python.org/3/library/glob.html">&lt;code>glob&lt;/code> documentation&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://cloud.tencent.com/developer/article/1150612">Python: glob匹配文件&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://www.techbeamers.com/python-glob/">Python Glob Module – Glob() Method&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://realpython.com/working-with-files-in-python/#filename-pattern-matching">Filename Pattern Matching&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://docs.python.org/3/library/fnmatch.html#module-fnmatch">&lt;code>fnmatch&lt;/code>&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.glob">https://docs.python.org/3/library/pathlib.html#pathlib.Path.glob&lt;/a>&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:3">
&lt;p>&lt;a href="https://docs.python.org/3/library/pathlib.html#pathlib.Path.rglob">https://docs.python.org/3/library/pathlib.html#pathlib.Path.rglob&lt;/a>&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item></channel></rss>