<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Python Papers]]></title><description><![CDATA[Learning and Developing in Python]]></description><link>https://www.pythonpapers.com</link><image><url>https://substackcdn.com/image/fetch/$s_!hYhe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e3c79a3-b014-495b-8ecb-094e0086d5f6_1280x1280.png</url><title>The Python Papers</title><link>https://www.pythonpapers.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 13 Jun 2026 00:47:23 GMT</lastBuildDate><atom:link href="https://www.pythonpapers.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Mike Driscoll]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[pypapers@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[pypapers@substack.com]]></itunes:email><itunes:name><![CDATA[Mike Driscoll]]></itunes:name></itunes:owner><itunes:author><![CDATA[Mike Driscoll]]></itunes:author><googleplay:owner><![CDATA[pypapers@substack.com]]></googleplay:owner><googleplay:email><![CDATA[pypapers@substack.com]]></googleplay:email><googleplay:author><![CDATA[Mike Driscoll]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How to Get TIFF Tag Data with Python]]></title><description><![CDATA[Last week, you learned how to get EXIF metadata from your JPEG files.]]></description><link>https://www.pythonpapers.com/p/how-to-get-tiff-tag-data-with-python</link><guid isPermaLink="false">https://www.pythonpapers.com/p/how-to-get-tiff-tag-data-with-python</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 09 Jun 2026 20:33:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!u4fk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://www.pythonpapers.com/p/how-to-get-image-exif-data-with-python">Last week</a>, you learned how to get EXIF metadata from your JPEG files. This week, you will learn how to get similar data from the TIFF image format.</p><p>Pillow provides a similar dictionary for TIFF images in its <code>TiffTags</code> module. If you need a TIFF image, you can use this one, which is a cover from one of the author's other books on <strong>ReportLab</strong>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u4fk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u4fk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 424w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 848w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 1272w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u4fk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png" width="546" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:546,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:649831,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/201360169?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!u4fk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 424w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 848w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 1272w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can create your own TIFF metadata extractor utility by making a new file named <code>tiff_metadata.py</code> and adding this code to it:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!APYh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!APYh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png 424w, https://substackcdn.com/image/fetch/$s_!APYh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png 848w, https://substackcdn.com/image/fetch/$s_!APYh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!APYh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!APYh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png" width="1408" height="1066" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1066,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133951,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/201360169?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!APYh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png 424w, https://substackcdn.com/image/fetch/$s_!APYh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png 848w, https://substackcdn.com/image/fetch/$s_!APYh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!APYh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b1efc6-10d1-4ecb-bad8-4db7a613dfae_1408x1066.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here, you import the <code>TAGS</code> dictionary from the <code>PIL.TiffTags</code> submodule. Then, in <code>get_metadata()</code>, you access the tag elements in the image by iterating over the contents of <code>tag.items()</code>. To make that information more readable, you use the <code>TAGS</code> dictionary that you imported.</p><p>Here is a sample of the output you will get when you run this code:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZjAe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZjAe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png 424w, https://substackcdn.com/image/fetch/$s_!ZjAe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png 848w, https://substackcdn.com/image/fetch/$s_!ZjAe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png 1272w, https://substackcdn.com/image/fetch/$s_!ZjAe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZjAe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png" width="1456" height="1221" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1221,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:220550,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/201360169?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZjAe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png 424w, https://substackcdn.com/image/fetch/$s_!ZjAe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png 848w, https://substackcdn.com/image/fetch/$s_!ZjAe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png 1272w, https://substackcdn.com/image/fetch/$s_!ZjAe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f19596-2d79-404e-834e-5e2621c72400_1474x1236.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can see that the value entries above are all tuples. This is because of how the data is returned from the tag data. If you would like a challenge, you can try cleaning up this data a bit in your version of the metadata extraction utility.</p><h2>Wrapping Up</h2><p>EXIF and TIFF metadata are really useful for encoding lots of information in your images. However, most people don&#8217;t even know that data is there! Knowing how to access your photo&#8217;s metadata allows you to do all kinds of programmatic tasks, such as resizing, sorting files by various parameters, and much more.</p><p>You can use Pillow and Python to do all kinds of other image processing, so this is just scratching the surface. Download Pillow today and start learning!</p><h2><strong>Want to Learn More?</strong></h2><p>You can learn more about what you can do with Python and Pillow in Mike&#8217;s book, <strong>Pillow: Image Processing with Python</strong></p><p>Purchase at <a href="https://driscollis.gumroad.com/l/pypillow">Gumroad</a>, <a href="https://leanpub.com/pillow">Leanpub</a>, or <a href="https://amzn.to/3ZvLfav">Amazon</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pythonpapers.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Python Papers is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[How to Get Image EXIF Data with Python]]></title><description><![CDATA[Digital photographs of the JPG filetype include a type of metadata that is known as Exchangeable Image File Format or simply Exif. You can access these tags using the PIL.ExifTags module.]]></description><link>https://www.pythonpapers.com/p/how-to-get-image-exif-data-with-python</link><guid isPermaLink="false">https://www.pythonpapers.com/p/how-to-get-image-exif-data-with-python</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 03 Jun 2026 13:40:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3pvb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Digital photographs of the JPG filetype include a type of metadata that is known as <strong>Exchangeable Image File Format</strong> or simply <strong>Exif</strong>. You can access these tags using the <code>PIL.ExifTags</code> module.</p><p>You can learn more about this module by checking out its <a href="https://pillow.readthedocs.io/en/stable/reference/ExifTags.html">documentation</a>.</p><p>In this article, you will focus on getting this image metadata using Pillow.</p><h2><strong>Getting Exif Tag Data</strong></h2><p>The <strong>Exchangeable Image File Format</strong> contains quite a bit of data about your photographs. It includes your camera&#8217;s settings when you took the image, such as ISO, aperture, focal length, exposure value, and more. Some cameras also include geographic coordinates in their Exif tags.</p><p>You will be using one of the author&#8217;s photos of a local bridge from the state of Iowa as it contains good Exif data:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3pvb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3pvb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png 424w, https://substackcdn.com/image/fetch/$s_!3pvb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png 848w, https://substackcdn.com/image/fetch/$s_!3pvb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png 1272w, https://substackcdn.com/image/fetch/$s_!3pvb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3pvb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png" width="1238" height="826" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:826,&quot;width&quot;:1238,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1815853,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/200452545?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3pvb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png 424w, https://substackcdn.com/image/fetch/$s_!3pvb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png 848w, https://substackcdn.com/image/fetch/$s_!3pvb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png 1272w, https://substackcdn.com/image/fetch/$s_!3pvb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Pillow can be used to retrieve the Exif metadata from the bridge photo above. To see how this works, create a file named <code>exif_getter.py</code> and add this code to it:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r3Hf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r3Hf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png 424w, https://substackcdn.com/image/fetch/$s_!r3Hf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png 848w, https://substackcdn.com/image/fetch/$s_!r3Hf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png 1272w, https://substackcdn.com/image/fetch/$s_!r3Hf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r3Hf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png" width="1408" height="1150" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1150,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:145545,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/200452545?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!r3Hf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png 424w, https://substackcdn.com/image/fetch/$s_!r3Hf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png 848w, https://substackcdn.com/image/fetch/$s_!r3Hf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png 1272w, https://substackcdn.com/image/fetch/$s_!r3Hf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff905f0fa-e7e0-4736-82b3-d3423bc0b3e1_1408x1150.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In this example, you create <code>get_exif()</code>, which takes in the path to the image that you want to extract Exif tags from. Then you create an <code>exif_table</code>, which is a Python dictionary. Next, you open up the image using Pillow and extract the Exif information using <code>_getexif()</code>. After that, you loop over the items you extracted and use Pillow&#8217;s <code>TAGS</code>, which is a hard-coded Python dictionary that maps a hexadecimal value to a human-readable name.</p><p>Once you have decoded the Exif data and populated the <code>exif_table</code> dictionary, you return the data. When you run this code using the bridge image, you will get a lot of output.</p><p>The following is a sample of some of the data that is returned:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sNLl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sNLl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png 424w, https://substackcdn.com/image/fetch/$s_!sNLl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png 848w, https://substackcdn.com/image/fetch/$s_!sNLl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!sNLl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sNLl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png" width="1408" height="1066" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1066,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:181205,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/200452545?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sNLl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png 424w, https://substackcdn.com/image/fetch/$s_!sNLl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png 848w, https://substackcdn.com/image/fetch/$s_!sNLl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!sNLl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad158d6-323f-43b9-82a2-f97ba47241bb_1408x1066.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Some of the data that is returned is not human-readable. One of the shortest examples is <code>ComponentsConfiguration</code> mentioned above. But there are several others. The <code>ComponentsConfiguration</code> property is a representation of the color planes in the image, starting at the 1st plane and going through the 4th plane. Not all images have the same amount of data as others. It depends on your camera and how much data it can record.</p><p>If you have edited the image yourself, you may have inadvertently deleted the Exif data. While it&#8217;s nice to crop or enhance a photo, you need to keep that in mind if you want to preserve the Exif data. You can use it to help you take photos in the future since it has all your camera settings at the time the shot was taken.</p><p>Now let&#8217;s find out how to get the Global Positioning System (GPS) Exif information from your images!</p><h2><strong>Getting GPS Exif Data</strong></h2><p>Camera phones can tag your photos with location data when you take a photo. Most phones have this off by default, but you can turn it on if you want to. Some newer cameras have built-in Global Positioning System (GPS) that provides this capability. The digital single-lens reflex (DSLR) cameras usually have some kind of accessory you can attach to your camera to have it record GPS too. Or you can add the GPS tags yourself on your computer!</p><p>Regardless of how the GPS information ends up in your photo, you can use Pillow to get it. For this example, you will use this image that was taken at Jester Park in Granger, Iowa:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nhWF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nhWF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png 424w, https://substackcdn.com/image/fetch/$s_!nhWF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png 848w, https://substackcdn.com/image/fetch/$s_!nhWF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png 1272w, https://substackcdn.com/image/fetch/$s_!nhWF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nhWF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png" width="896" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:896,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1409020,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/200452545?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nhWF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png 424w, https://substackcdn.com/image/fetch/$s_!nhWF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png 848w, https://substackcdn.com/image/fetch/$s_!nhWF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png 1272w, https://substackcdn.com/image/fetch/$s_!nhWF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17031300-8de7-494a-97e4-c65a3e42bedc_896x600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now that you have a photo to use, you need to write some code! Open up your editor and create a new file named <code>gps_exif_getter.py</code>. Then add the following:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!azwo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed681207-a896-4a90-8858-94cec65729a4_1408x1534.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!azwo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed681207-a896-4a90-8858-94cec65729a4_1408x1534.png 424w, https://substackcdn.com/image/fetch/$s_!azwo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed681207-a896-4a90-8858-94cec65729a4_1408x1534.png 848w, https://substackcdn.com/image/fetch/$s_!azwo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed681207-a896-4a90-8858-94cec65729a4_1408x1534.png 1272w, https://substackcdn.com/image/fetch/$s_!azwo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed681207-a896-4a90-8858-94cec65729a4_1408x1534.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!azwo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed681207-a896-4a90-8858-94cec65729a4_1408x1534.png" width="1408" height="1534" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed681207-a896-4a90-8858-94cec65729a4_1408x1534.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1534,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:211092,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/200452545?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed681207-a896-4a90-8858-94cec65729a4_1408x1534.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!azwo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed681207-a896-4a90-8858-94cec65729a4_1408x1534.png 424w, https://substackcdn.com/image/fetch/$s_!azwo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed681207-a896-4a90-8858-94cec65729a4_1408x1534.png 848w, https://substackcdn.com/image/fetch/$s_!azwo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed681207-a896-4a90-8858-94cec65729a4_1408x1534.png 1272w, https://substackcdn.com/image/fetch/$s_!azwo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed681207-a896-4a90-8858-94cec65729a4_1408x1534.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The first new item here is that you need to import <code>GPSTAGS</code> in addition to <code>TAGS</code>. The next thing you need to do is add a second loop (lines 16-18) after decoding the regular Exif tags. Right before that second loop, you create a new <code>gps_info</code> dictionary. Then you loop over the keys in the <code>exif_table['GPSInfo']</code> dictionary and decode the GPS tags in the same way that you did with the regular Exif tags.</p><p>When you run this code, you should get the following output:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V0AE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V0AE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png 424w, https://substackcdn.com/image/fetch/$s_!V0AE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png 848w, https://substackcdn.com/image/fetch/$s_!V0AE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png 1272w, https://substackcdn.com/image/fetch/$s_!V0AE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V0AE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png" width="1408" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:58825,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/200452545?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!V0AE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png 424w, https://substackcdn.com/image/fetch/$s_!V0AE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png 848w, https://substackcdn.com/image/fetch/$s_!V0AE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png 1272w, https://substackcdn.com/image/fetch/$s_!V0AE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc49bb3a3-b65e-49fb-8931-391a91f05601_1408x512.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can use this information to look up the image's location on a map. You could even write some code for Google Maps that you could use to programmatically load up a map of where you took your photos, if you wanted to.</p><h2>Wrapping Up</h2><p>Image metadata is important. You can use it to learn how to take better photographs. If your camera supports geographic tagging, you can use that data to programmatically determine where a photo was taken.</p><p>You can use EXIF data to build all kinds of fun applications that you can use to analyze photos, label them, combine them, and do much more using Python or other external tools.</p><h2>Want to Learn More?</h2><p>You can learn more about what you can do with Python and Pillow in Mike&#8217;s book, <strong>Pillow: Image Processing with Python</strong></p><p>Purchase at <a href="https://driscollis.gumroad.com/l/pypillow">Gumroad</a>, <a href="https://leanpub.com/pillow">Leanpub</a>, or <a href="https://amzn.to/3ZvLfav">Amazon</a></p>]]></content:encoded></item><item><title><![CDATA[How to Resize a Photo with Python]]></title><description><![CDATA[Sometimes you will find yourself wanting to resize a photo.]]></description><link>https://www.pythonpapers.com/p/how-to-resize-a-photo-with-python</link><guid isPermaLink="false">https://www.pythonpapers.com/p/how-to-resize-a-photo-with-python</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 27 May 2026 14:13:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!a4qO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd212f404-b7da-4897-9eeb-41e268c23bd0_1534x1236.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sometimes you will find yourself wanting to resize a photo. I usually do this for photos I plan to email or post on a website, since some of my images can be quite large. Normal people use an image editor. I usually do as well, but for fun, I thought I would look into how to do it in Python.</p><p>The quickest way to do this is to use the Pillow package, which&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/how-to-resize-a-photo-with-python">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python 101 - How to Scrape a Website]]></title><description><![CDATA[The Internet is the host of much of the world&#8217;s information, both past and present.]]></description><link>https://www.pythonpapers.com/p/python-101-how-to-scrape-a-website</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-101-how-to-scrape-a-website</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 19 May 2026 15:48:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VM3C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F912664d7-520c-406e-9ad2-9d837e818fca_2242x1492.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The Internet is the host of much of the world&#8217;s information, both past and present. You can find history, news, comics, and much more on the Internet. As a software developer, you might want to gain access to the troves of data that exist on the Internet. Some web pages provide a free or paid <strong>Application Programming Interface (API)</strong> that you can use to p&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-101-how-to-scrape-a-website">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Convert a Photo to Black and White in Python]]></title><description><![CDATA[Black-and-white images aren&#8217;t for everyone.]]></description><link>https://www.pythonpapers.com/p/convert-a-photo-to-black-and-white</link><guid isPermaLink="false">https://www.pythonpapers.com/p/convert-a-photo-to-black-and-white</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 12 May 2026 17:42:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vw_J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fdb79e-e26e-4665-8b5a-d80742a329d9_1196x810.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Black-and-white images aren&#8217;t for everyone. I personally like to play around with them, as you can sometimes take a boring photo and turn it into something dramatic. I have also rescued a drab photo by turning it black and white. If you want to convert a photo you took to black and white programmatically, the Pillow package has you covered. In this arti&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/convert-a-photo-to-black-and-white">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Textual-cogs 0.0.5 Released]]></title><description><![CDATA[I always thought it would be fun to create my own open source libraries or applications and distribute them somehow.]]></description><link>https://www.pythonpapers.com/p/textual-cogs-005-released</link><guid isPermaLink="false">https://www.pythonpapers.com/p/textual-cogs-005-released</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Mon, 04 May 2026 15:21:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sUsQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072b0151-9a55-449c-97ab-8965551e3d16_933x573.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I always thought it would be fun to create my own open source libraries or applications and distribute them somehow. When I started writing my book, <a href="https://driscollis.gumroad.com/l/textual">Creating TUI Applications with Textual and Python</a>, I took the plunge and wrote a helper package called <a href="https://github.com/driscollis/textual-cogs">textual-cogs,</a> which is a collection of reusable dialogs and widgets for Textual. Right now, it is mostl&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/textual-cogs-005-released">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Pop Quiz - Modulo List Comprehension]]></title><description><![CDATA[Python list comprehensions are great.]]></description><link>https://www.pythonpapers.com/p/python-pop-quiz-modulo-list-comprehension</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-pop-quiz-modulo-list-comprehension</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 29 Apr 2026 13:18:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hYhe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e3c79a3-b014-495b-8ecb-094e0086d5f6_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Python list comprehensions are great. The list comprehension is a way to take a Python <code>for</code> loop and make it a one-liner piece of code.</p><p>List comprehensions can include conditional statements that act like filters. They can even contain other list comprehensions, making them difficult to read and comprehend.</p><p>If you don&#8217;t know how to make a list comprehensio&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-pop-quiz-modulo-list-comprehension">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[wxPython - Creating a Simple Image Viewer]]></title><description><![CDATA[The first step in creating an application is to come up with an idea.]]></description><link>https://www.pythonpapers.com/p/wxpython-creating-a-simple-image</link><guid isPermaLink="false">https://www.pythonpapers.com/p/wxpython-creating-a-simple-image</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 22 Apr 2026 16:50:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fiSB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cb3e90f-8911-45b4-bc87-2e40e328bf7e_450x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The first step in creating an application is to come up with an idea. You could try to copy something simple like Microsoft Paint or Notepad. You will quickly find that they aren&#8217;t so easy to emulate as you would think, though! So instead, you will create a simple application that can load and display a photo.</p><p>When it comes to creating a GUI application,&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/wxpython-creating-a-simple-image">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python 101 - How to Create an "exe" for Mac]]></title><description><![CDATA[Each operating system has its own method of installing or running an application.]]></description><link>https://www.pythonpapers.com/p/python-101-how-to-create-an-exe-for</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-101-how-to-create-an-exe-for</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 14 Apr 2026 13:31:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BImZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ac75576-2e03-4f46-851b-e7919789a1d0_1536x3662.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Each operating system has its own method of installing or running an application. On Windows, you run an executable most of the time. Executables have an extension of <code>.exe</code>. Apple&#8217;s Mac software has the concept of applications that use the extension <code>.app</code>. These are technically a bundle of files including a runnable binary. They are kind of like a runnabl&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-101-how-to-create-an-exe-for">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Textual - An Intro to DOM Queries (Part II)]]></title><description><![CDATA[Last week, you learned the basics of Textual&#8217;s DOM queries.]]></description><link>https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part-a6d</link><guid isPermaLink="false">https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part-a6d</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 08 Apr 2026 17:06:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JVnb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa490a257-e998-4581-9f20-9c0763d1fb36_1446x1340.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week, you learned the basics of Textual&#8217;s DOM queries. If you missed it, you can <a href="https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part">read the article</a> now!</p><p>In this tutorial you will be learning about the following topics:</p><ul><li><p>The DOMQuery object</p></li><li><p>Getting the first or last widget</p></li><li><p>Query filters</p></li><li><p>Query exclusions</p></li><li><p>Other query methods</p></li></ul><p>Let&#8217;s get started!</p><h2><strong>The DOMQuery Object</strong></h2><p>The <code>DOMQuery</code> object gets returned whenever you &#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part-a6d">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Textual - An Intro to DOM Queries (Part I)]]></title><description><![CDATA[In this article, you will learn how to query the DOM in Textual.]]></description><link>https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part</link><guid isPermaLink="false">https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 31 Mar 2026 17:54:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!V0VY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8fa373-1808-4e27-983c-76dafa14fb36_1550x1266.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In this article, you will learn how to query the DOM in Textual. You will discover that the DOM keeps track of all the widgets in your application. By running queries against the DOM, you can find widgets quickly and update them, too.</p><p>You will be learning the following topics related to the DOM:</p><ul><li><p>The query one method</p></li><li><p>Textual queries</p></li></ul><p>You will learn more in th&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Pop Quiz - List Popping]]></title><description><![CDATA[The Python list data type is much like an array in other programming languages.]]></description><link>https://www.pythonpapers.com/p/python-pop-quiz-list-popping</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-pop-quiz-list-popping</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Thu, 26 Mar 2026 15:05:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!G3wZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb337ced-09c9-4b31-83e4-90fe1ebb1601_2550x3204.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The Python list data type is much like an array in other programming languages. The list includes many different methods. You can get a full listing of those methods like this:</p><pre><code>my_list = []
print(dir(my_list))</code></pre><p>One of those methods is called <code>pop()</code>. You can pass an index of the item you want to pop from the list (if you don&#8217;t, the last item is chosen). That&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-pop-quiz-list-popping">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Pop Quiz - Truthy or Falsey]]></title><description><![CDATA[Python supports Booleans in much the same way as other programming languages do.]]></description><link>https://www.pythonpapers.com/p/python-pop-quiz-truthy-or-falsey</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-pop-quiz-truthy-or-falsey</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 18 Mar 2026 13:40:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uShb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec0460c-a373-48af-8265-a668470c7160_1260x670.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Python supports Booleans in much the same way as other programming languages do. In Python&#8217;s case, it uses the <code>True</code> and <code>False</code> keywords. But there is also the concept of truthy and falsey. An example of a truthy value in Python is a number greater than zero (also a number less than zero), and an example of a falsey value would be an empty string. When us&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-pop-quiz-truthy-or-falsey">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Textual - Creating a Custom Checkbox]]></title><description><![CDATA[Textual is a great Python user interface package.]]></description><link>https://www.pythonpapers.com/p/textual-creating-a-custom-checkbox</link><guid isPermaLink="false">https://www.pythonpapers.com/p/textual-creating-a-custom-checkbox</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 11 Mar 2026 18:04:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ugD_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d4c7095-68f1-4b03-b22b-8ff158d4697e_1740x1066.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Textual is a great Python user interface package. Textual lets you create a GUI-like interface in your terminal.</p><p>You can use many different widgets in Textual. However, the widget you will be focusing on in this tutorial is the humble checkbox.</p><p>Checkboxes are used for Boolean choices. They return a True if checked and a False if unchecked. You can use a c&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/textual-creating-a-custom-checkbox">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Pop Quiz - Positional Arguments]]></title><description><![CDATA[Python functions can take in several different types of arguments.]]></description><link>https://www.pythonpapers.com/p/python-pop-quiz-positional-arguments</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-pop-quiz-positional-arguments</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Thu, 05 Mar 2026 13:37:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9Gq-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb19e656-6139-4775-8791-115954bf9e6f_2260x1756.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Python functions can take in several different types of arguments. What are the different argument types called?</p><p>If you don&#8217;t know, you should review the following:</p><ul><li><p>Positional arguments</p></li><li><p>Keyword arguments</p></li></ul><p>This information may help you solve the quiz, or it may confuse you more. Read the next section when you&#8217;re ready to take a crack at it!</p><h2><strong>The Quiz</strong></h2><p>How do you &#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-pop-quiz-positional-arguments">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Pop Quiz - Type Addition]]></title><description><![CDATA[Python has multiple built-in functions you can use to introspect your code.]]></description><link>https://www.pythonpapers.com/p/python-pop-quiz-type-addition</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-pop-quiz-type-addition</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 25 Feb 2026 13:43:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!txoC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798f0eee-fd0f-4a50-8bb6-8b0caea2a350_2464x2260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Python has multiple built-in functions you can use to introspect your code. You&#8217;ll learn more about those functions in a later quiz.</p><p>For this quiz, you&#8217;ll focus on <code>isinstance()</code>, a function you can use to check if a variable is a particular type. For example, you might want to check if a variable is a string or an integer.</p><p>Good luck!</p><h2><strong>The Quiz</strong></h2><p>What will be th&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-pop-quiz-type-addition">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Pop Quiz - Letter Explosion]]></title><description><![CDATA[You learned about exploding a range object in the last quiz.]]></description><link>https://www.pythonpapers.com/p/python-pop-quiz-letter-explosion</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-pop-quiz-letter-explosion</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 17 Feb 2026 15:17:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lQbZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3994bbeb-77d2-47cf-bf04-d1a81a30bf61_2056x1416.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You learned about exploding a <code>range</code> object in the last quiz. For this quiz, you will extend that knowledge and discover what happens when you explode a string.</p><p>But wait! There&#8217;s more here than meets the eye. What is up with the numbers in the squiggly brackets?</p><p>If you&#8217;re familiar with string methods, you can figure this quiz out pretty quickly!</p><h2><strong>The Quiz</strong></h2><p>Wha&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-pop-quiz-letter-explosion">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Basic Type Hinting]]></title><description><![CDATA[When Python first added type hinting to the language in version 3.5, you could only add type hints to functions.]]></description><link>https://www.pythonpapers.com/p/python-basic-type-hinting</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-basic-type-hinting</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 10 Feb 2026 17:13:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hYhe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e3c79a3-b014-495b-8ecb-094e0086d5f6_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When Python first added type hinting to the language in version 3.5, you could only add type hints to functions. However, in Python 3.6, the language added the ability to annotate variables as well. Over the following years, Python has steadily added more features to its type hinting capabilities and slowly refined the typing interface.</p><p>You will be study&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-basic-type-hinting">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Pop Quiz - Number Explosion]]></title><description><![CDATA[You will sometimes come across examples of code that use one or two asterisks.]]></description><link>https://www.pythonpapers.com/p/python-pop-quiz-number-explosion</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-pop-quiz-number-explosion</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Fri, 06 Feb 2026 00:43:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RYhS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You will sometimes come across examples of code that use one or two asterisks. Depending on how the asterisks are used, they can mean different things to Python.</p><p>Check your understanding of what a single asterisk means in the following quiz!</p><h2><strong>The Quiz</strong></h2><p>What will be the output if you run this code?</p><p>A) <code>{range}</code> </p><p>B) <code>(range)</code> </p><p>C) <code>[0, 1, 2]</code> </p><p>D) <code>(0, 1, 2)</code> </p><p>E) <code>{0, 1, 2}</code></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RYhS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RYhS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png 424w, https://substackcdn.com/image/fetch/$s_!RYhS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png 848w, https://substackcdn.com/image/fetch/$s_!RYhS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png 1272w, https://substackcdn.com/image/fetch/$s_!RYhS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RYhS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png" width="1456" height="1253" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/caa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1253,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:750347,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/187025709?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RYhS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png 424w, https://substackcdn.com/image/fetch/$s_!RYhS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png 848w, https://substackcdn.com/image/fetch/$s_!RYhS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png 1272w, https://substackcdn.com/image/fetch/$s_!RYhS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa7db67-52b7-4510-9804-af6c2c3027e8_1840x1584.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>St&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-pop-quiz-number-explosion">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Typing Book Kickstarter]]></title><description><![CDATA[Python has had type hinting support since Python 3.5, over TEN years ago!]]></description><link>https://www.pythonpapers.com/p/python-typing-book-kickstarter</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-typing-book-kickstarter</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 03 Feb 2026 15:25:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RP_P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36123bf0-9b1b-4da0-a31b-2c4f784c38fe_1800x2700.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Python has had type hinting support since Python 3.5, over TEN years ago! However, Python&#8217;s type annotations have changed repeatedly over the years. In <strong>Python Typing: Type Checking for Python Programmers</strong>, you will learn all you need to know to add type hints to your Python applications effectively.</p><p>You will also learn how to use Python type checkers, con&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-typing-book-kickstarter">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>