SlideShare a Scribd company logo
.
.
Building Bridges
pyfilesystem: unified access to storages and services
Andreas Jung
@MacYET

info@zopyx.com

www.zopyx.com

Python Users Berlin 03/2016
/about
• 20 years in publishing
business since 1995
• Python, Zope, Plone
• XML, PDF, EPUB, 

DOCX, DITA
Agenda
• pyfilesystem
• storages systems
• storage APIs
• unified access to
storages
• not: storage/service
specific higher API
functionality
Publishing solutions require
connectivity to different storages
Our Publishing Universe
Our Publishing Universe
Characteristics of storages
• usually hierarchical model (folders, collections,
files)
• folder operations:
• makedir, renamedir, removedir, exists…
• file operations:
• open, read, write, exists, stat…
Common problem
• every storage/filesystem/service has its own API/SDK 

(or several )
• standard filesystem API
• Dropbox API
• Google Drive API
• Sharepoint: WebDAV, CMIS, REST
• specific code for each storage type
• storages not easily interchangeable
pyfilesystem
• abstraction layer on top of storages,
access through a uniform API
• Python 2/3 compatible
• various filesystem/webservices drivers
• Goal: your code must not know about
the underlaying storage system. The
backend is just a configuration option.
• extensible (writing a new driver is
straight forward
• sandboxed filesystem operations
• OOTB support for: WebDAV, S(FTP),
RPCFS, OSFS, S3, ZIP, Memory,
MultiFS, WrapFS
handle = fs.opener(some_url)
with handle.open('foo', 'w') as fp:
fp.write(data)
handle.listdir(dirname)
handle.makedir('foo/bar/test')
handle.removedir('foo/bar/test)
handle.exists(some_filename)
handle.isfile(some_name)
handle.move(src, dst)
handle.copy(src, dst)
….
pyfilesystem concepts
• Sandboxing
• no access outside to resources outside a configured root path
• Paths
• '/' as path separator
• '.' current directory
• '..' parent directory
• Errors
• Identical exceptions across filesystem/storage types
Opening filesystems/storages
from fs.osfs import OSFS
my_f = OSFS('/foo/bar')
from fs.contrib.davfs import DAVFS
dav_fs = DAVFS('http://host:port/webdav', credentials=…)
from fs.opener import opener
ftp_fs, path = opener.parse('ftp://ftp.mozilla.org/pub')
davs_fs, path = opener.parse('http://user:pass@host:port/webdav')
s3_fs, path = opener.parse('s3://mybucket/some/folter')
Multi-filesystem (read-only)
from fs.osfs import OSFS
from fs.multifs import MultiFS
themed_template_fs = MultiFS()
themed_template_fs.addfs('templates', OSFS('templates'))
themed_template_fs.addfs('theme', OSFS('theme'))
-- templates
|-- snippets
| `-- panel.html
|-- index.html
|-- profile.html
`-- base.html
-- theme
|-- snippets
| |-- widget.html
| `-- extra.html
|-- index.html
`-- theme.html
Multi-filesystem (read-only)
from fs.osfs import OSFS
from fs.multifs import MultiFS
themed_template_fs = MultiFS()
themed_template_fs.addfs('templates', OSFS('templates'))
themed_template_fs.addfs('theme', OSFS('theme'))
-- templates
|-- snippets
| `-- panel.html
|-- index.html
|-- profile.html
`-- base.html
-- theme
|-- snippets
| |-- widget.html
| `-- extra.html
|-- index.html
`-- theme.html
|-- snippets
| |-- panel.html
| |-- widget.html
| `-- extra.html
|-- index.html
|-- profile.html
|-- base.html
`-- theme.html
Implementing drivers/

essential methods
open() Opens a file for read/writing
isfile() Check whether the path exists and is a file
isdir() Check whether a path exists and is a directory
listdir() List the contents of a directory
makedir() Create a new directory
remove() Remove an existing file
removedir() Remove an existing directory
rename() Atomically rename a file or directory
getinfo() Return information about the path e.g. size, mtime
Implementing drivers/

non-essential methods
copy() Copy a file to a new location
copydir() Recursively copy a directory to a new location
desc() Return a short descriptive text regarding a path
exists() Check whether a path exists as file or directory
listdirinfo() Get a directory listing along 

with the info dict for each entry
ilistdir() Generator version of the listdir method
ilistdirinfo() Generator version of the listdirinfo method
getpathurl() Get an external URL at which the 

given file can be accessed, if possible
getsyspath() Get a file’s name in the local filesystem, if possible
getmeta() Get the value of a filesystem meta value, if it exists
getmmap() Gets an mmap object for the given resource, if supported
hassyspath() Check if a path maps to a system path 

(recognized by the OS)
haspathurl() Check if a path maps to an external URL
hasmeta() Check if a filesystem meta value exists
move() Move a file to a new location
movedir() Recursively move a directory to a new location
settimes() Sets the accessed and modified times of a path
PyFilesystem
WebDAV (S)FTP
pyfilesystem
Plone
xmldirector.plonecore
Dropbox
GDriveAWS S3
Local FS
Architecture
OwnCloud

Alfresco

eXistDB

BaseX
Dropbox
Sharepoint Evernote
Facebook Flickr
Yandex
OneDrive
many others
Driver Driver Driver
SMEOtixo DropDav
WebDAV
native

protocols native

protocols
Your setup SaaS setup
Storage/

Web Service
self-hosted
(Privacy)
via external
SaaS Bridge
(limited privacy?)
WebDAV 

(Owncloud, BaseX,

eXist-DB, Alfresco, etc.)
YES YES
Amazon S3 YES YES
Local filesystem YES NO
Dropbox (YES, auth token issues) YES
FTP/SFTP (YES, V1.4) YES
4Shared ADrive Alfresco Amazon Cloud
Amazon S3 Box CloudMe Copy Cubby
Digital Bucket DriveOnWeb Dropbox Dump
Truck Evernote FTP Fabasoft Facebook
FilesAnywhere Flickr GMX.DE Google Drive
HiDrive Huddle LiveDrive Mediencenter
MyDrive OneDrive Online FileFolder
OwnCloud Picasa SugarSync TrendMicro
SafeSync Web.de WebDAV Yandex
NO YES
pyfilesystem driver options
Supported services through 

3rd party services (example)
Further development
(Funding)
• native Dropbox support (via Dropbox SDK)
• NTML authentication support for WebDAV driver
• native Sharepoint/Office 365 support (via
CMIS, REST, WebDAV NTLM, Microsoft Graph)
• anyone interested in funding further drivers?
PyFilesystem
Conclusions
• the underlaying storage/filesystem is just a
configuration option
• same code will work across different storage types
• unit-test your pyfilesystem-based code against
used storage types
• minor behavioral differences between drivers
• dealing with OAuth (Dropbox, Google Drive)
pyfilesystem
> pip install fs
https://pyfilesystem.readthedocs.org/
https://github.com/revolunet/pyfilesystem

More Related Content

PPTX
Pragmatic plone projects
PPTX
Pragmatische Plone Projekte
PDF
Frequently asked questions answered frequently - but now for the last time
PDF
Plone 5 theming
PPTX
PHP language presentation
PPTX
DSpace 4.2 Transmission: Import/Export
PPT
Class 1 - World Wide Web Introduction
PPTX
DSpace 4.2 Basics & Configuration
Pragmatic plone projects
Pragmatische Plone Projekte
Frequently asked questions answered frequently - but now for the last time
Plone 5 theming
PHP language presentation
DSpace 4.2 Transmission: Import/Export
Class 1 - World Wide Web Introduction
DSpace 4.2 Basics & Configuration

What's hot (20)

PPTX
Using existing language skillsets to create large-scale, cloud-based analytics
PDF
Serialization (Avro, Message Pack, Kryo)
PPT
8b. Column Oriented Databases Lab
PDF
Sanjip Shah: Internationalizing and Localizing WordPress Themes
KEY
Drupal in 30 Minutes
PDF
Web performances : Is It not the right time to (re)consider CMS ?
PDF
From XML to eBooks Part 2: The Details
PDF
Solr Powered Lucene
PDF
Decoupled Libraries for PHP
PDF
ApacheCon09: Avro
PDF
Consuming RESTful services in PHP
PPTX
Serialization and performance by Sergey Morenets
PPT
DSpace Tutorial : Open Source Digital Library
PDF
What's brewing in the eZ Systems extensions kitchen
PDF
Ancient To Modern: Upgrading nearly a decade of Plone in public radio
PPTX
Thrift vs Protocol Buffers vs Avro - Biased Comparison
PPTX
OpenNTF Domino API - Overview Introduction
PPT
ODP
Introduction to MongoDB with PHP
PDF
Introduction to Drupal (7) Theming
Using existing language skillsets to create large-scale, cloud-based analytics
Serialization (Avro, Message Pack, Kryo)
8b. Column Oriented Databases Lab
Sanjip Shah: Internationalizing and Localizing WordPress Themes
Drupal in 30 Minutes
Web performances : Is It not the right time to (re)consider CMS ?
From XML to eBooks Part 2: The Details
Solr Powered Lucene
Decoupled Libraries for PHP
ApacheCon09: Avro
Consuming RESTful services in PHP
Serialization and performance by Sergey Morenets
DSpace Tutorial : Open Source Digital Library
What's brewing in the eZ Systems extensions kitchen
Ancient To Modern: Upgrading nearly a decade of Plone in public radio
Thrift vs Protocol Buffers vs Avro - Biased Comparison
OpenNTF Domino API - Overview Introduction
Introduction to MongoDB with PHP
Introduction to Drupal (7) Theming
Ad

Viewers also liked (20)

PDF
State Of Zope Linuxtag 2008
PDF
Integration of Plone with eXist-db
PDF
Plone4Universities
PDF
Onkopedia - Ein medizinisches Leitlinienportal auf dem Weg zu XML-basierten P...
PDF
XML Director - the technical foundation of onkopedia.com
PDF
Making Py Pi Sux Less Key
PDF
BRAINREPUBLIC - Powered by no-SQL
PDF
Plone Integration with eXist-db - Structured Content rocks
PDF
Pragmatic plone projects
PDF
Producing high-quality documents with Plone
PPTX
Produce & Publish Authoring Environment V 2.0 (english version)
PDF
Produce & Publish Authoring Environment World Plone Day 2010 - Berlin
PDF
Building bridges - Plone Conference 2015 Bucharest
PDF
CSS Paged Media - A review of tools and techniques
PPTX
Python mongo db-training-europython-2011
PDF
Why Plone Will Die
PDF
Why we love ArangoDB. The hunt for the right NosQL Database
PPTX
zopyx.plone migration - Plone Hochschultagung 2013
PDF
Eggs, Buildouts und andere Wunderlichkeiten
PDF
Dzug Zope Optimized
State Of Zope Linuxtag 2008
Integration of Plone with eXist-db
Plone4Universities
Onkopedia - Ein medizinisches Leitlinienportal auf dem Weg zu XML-basierten P...
XML Director - the technical foundation of onkopedia.com
Making Py Pi Sux Less Key
BRAINREPUBLIC - Powered by no-SQL
Plone Integration with eXist-db - Structured Content rocks
Pragmatic plone projects
Producing high-quality documents with Plone
Produce & Publish Authoring Environment V 2.0 (english version)
Produce & Publish Authoring Environment World Plone Day 2010 - Berlin
Building bridges - Plone Conference 2015 Bucharest
CSS Paged Media - A review of tools and techniques
Python mongo db-training-europython-2011
Why Plone Will Die
Why we love ArangoDB. The hunt for the right NosQL Database
zopyx.plone migration - Plone Hochschultagung 2013
Eggs, Buildouts und andere Wunderlichkeiten
Dzug Zope Optimized
Ad

Similar to PyFilesystem (20)

PPTX
Hadoop 20111117
PDF
Javase7 1641812
PPT
Alfresco In An Hour - Document Management, Web Content Management, and Collab...
PPTX
Dspace4 150227090306-conversion-gate01
PDF
Filesystem Management with Flysystem - php[tek] 2023
PDF
Fuse'ing python for rapid development of storage efficient FS
PPTX
Essential Camel Components
PDF
Filesystem Management with Flysystem at PHP UK 2023
PDF
20090514 Introducing Puppet To Sasag
PDF
Symfony2 revealed
PDF
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
 
PPTX
[DanNotes] XPages - Beyound the Basics
PDF
Hdfs java api
PDF
AHUG Presentation: Fun with Hadoop File Systems
PPT
Building File Systems with FUSE
PPTX
Introduction to Monsoon PHP framework
PPTX
Reusable, composable, battle-tested Terraform modules
PDF
Docker Tips And Tricks at the Docker Beijing Meetup
PDF
Disk to Cloud: Abstract your File Operations with CBFS
PDF
Fuse technology-2015
Hadoop 20111117
Javase7 1641812
Alfresco In An Hour - Document Management, Web Content Management, and Collab...
Dspace4 150227090306-conversion-gate01
Filesystem Management with Flysystem - php[tek] 2023
Fuse'ing python for rapid development of storage efficient FS
Essential Camel Components
Filesystem Management with Flysystem at PHP UK 2023
20090514 Introducing Puppet To Sasag
Symfony2 revealed
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
 
[DanNotes] XPages - Beyound the Basics
Hdfs java api
AHUG Presentation: Fun with Hadoop File Systems
Building File Systems with FUSE
Introduction to Monsoon PHP framework
Reusable, composable, battle-tested Terraform modules
Docker Tips And Tricks at the Docker Beijing Meetup
Disk to Cloud: Abstract your File Operations with CBFS
Fuse technology-2015

More from Andreas Jung (20)

PDF
A fool with a tool is still a fool - Plone Tagung 2025 in Koblenz
PDF
zopyx-fastapi-auth - authentication and authorization for FastAPI
PDF
State of PrintCSS - MarkupUK 2023.pdf
PDF
Typesense Plone Integration Plone Conference 2022 Namur
PDF
Onkopedia - Plone Tagung 2020 Dresden
PDF
PrintCSS W3C workshop at XMLPrague 2020
PDF
PrintCSS workshop XMLPrague 2020
PDF
Plone 5.2 migration at University Ghent, Belgium
PDF
Back to the future - Plone 5.2 und Python 3 Migration am Beispiel Onkopedia
PDF
Plone migrations using plone.restapi
PDF
Plone Migrationen mit Plone REST API
PDF
Plone im Einsatz bei der Universität des Saarländes als Shop-System und Gefah...
PDF
Generierung von PDF aus XML/HTML mit PrintCSS
PDF
Creating Content Together - Plone Integration with SMASHDOCs
PPTX
Creating Content Together - Plone Integration with SMASHDOCs
PDF
The Plone and The Blockchain
PDF
Content Gemeinsam Erstellen: Integration Plone mit SMASHDOCs
PDF
PDF Generierung mit XML/HTML und CSS - was die Tools können und was nicht.
PPTX
Produce & Publish Cloud Edition
PPTX
Onkopedia - ein medizinisches Fachportal auf Basis von Plone
A fool with a tool is still a fool - Plone Tagung 2025 in Koblenz
zopyx-fastapi-auth - authentication and authorization for FastAPI
State of PrintCSS - MarkupUK 2023.pdf
Typesense Plone Integration Plone Conference 2022 Namur
Onkopedia - Plone Tagung 2020 Dresden
PrintCSS W3C workshop at XMLPrague 2020
PrintCSS workshop XMLPrague 2020
Plone 5.2 migration at University Ghent, Belgium
Back to the future - Plone 5.2 und Python 3 Migration am Beispiel Onkopedia
Plone migrations using plone.restapi
Plone Migrationen mit Plone REST API
Plone im Einsatz bei der Universität des Saarländes als Shop-System und Gefah...
Generierung von PDF aus XML/HTML mit PrintCSS
Creating Content Together - Plone Integration with SMASHDOCs
Creating Content Together - Plone Integration with SMASHDOCs
The Plone and The Blockchain
Content Gemeinsam Erstellen: Integration Plone mit SMASHDOCs
PDF Generierung mit XML/HTML und CSS - was die Tools können und was nicht.
Produce & Publish Cloud Edition
Onkopedia - ein medizinisches Fachportal auf Basis von Plone

Recently uploaded (20)

PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
AI in Product Development-omnex systems
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
Introduction to Artificial Intelligence
PDF
Digital Strategies for Manufacturing Companies
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PPTX
Operating system designcfffgfgggggggvggggggggg
PPTX
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
PPTX
history of c programming in notes for students .pptx
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
System and Network Administration Chapter 2
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
AI in Product Development-omnex systems
VVF-Customer-Presentation2025-Ver1.9.pptx
Softaken Excel to vCard Converter Software.pdf
Navsoft: AI-Powered Business Solutions & Custom Software Development
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Wondershare Filmora 15 Crack With Activation Key [2025
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Introduction to Artificial Intelligence
Digital Strategies for Manufacturing Companies
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Operating system designcfffgfgggggggvggggggggg
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
history of c programming in notes for students .pptx
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
ManageIQ - Sprint 268 Review - Slide Deck
Design an Analysis of Algorithms II-SECS-1021-03
System and Network Administration Chapter 2

PyFilesystem

  • 1. . . Building Bridges pyfilesystem: unified access to storages and services Andreas Jung @MacYET
 info@zopyx.com
 www.zopyx.com
 Python Users Berlin 03/2016
  • 2. /about • 20 years in publishing business since 1995 • Python, Zope, Plone • XML, PDF, EPUB, 
 DOCX, DITA
  • 3. Agenda • pyfilesystem • storages systems • storage APIs • unified access to storages • not: storage/service specific higher API functionality
  • 7. Characteristics of storages • usually hierarchical model (folders, collections, files) • folder operations: • makedir, renamedir, removedir, exists… • file operations: • open, read, write, exists, stat…
  • 8. Common problem • every storage/filesystem/service has its own API/SDK 
 (or several ) • standard filesystem API • Dropbox API • Google Drive API • Sharepoint: WebDAV, CMIS, REST • specific code for each storage type • storages not easily interchangeable
  • 9. pyfilesystem • abstraction layer on top of storages, access through a uniform API • Python 2/3 compatible • various filesystem/webservices drivers • Goal: your code must not know about the underlaying storage system. The backend is just a configuration option. • extensible (writing a new driver is straight forward • sandboxed filesystem operations • OOTB support for: WebDAV, S(FTP), RPCFS, OSFS, S3, ZIP, Memory, MultiFS, WrapFS handle = fs.opener(some_url) with handle.open('foo', 'w') as fp: fp.write(data) handle.listdir(dirname) handle.makedir('foo/bar/test') handle.removedir('foo/bar/test) handle.exists(some_filename) handle.isfile(some_name) handle.move(src, dst) handle.copy(src, dst) ….
  • 10. pyfilesystem concepts • Sandboxing • no access outside to resources outside a configured root path • Paths • '/' as path separator • '.' current directory • '..' parent directory • Errors • Identical exceptions across filesystem/storage types
  • 11. Opening filesystems/storages from fs.osfs import OSFS my_f = OSFS('/foo/bar') from fs.contrib.davfs import DAVFS dav_fs = DAVFS('http://host:port/webdav', credentials=…) from fs.opener import opener ftp_fs, path = opener.parse('ftp://ftp.mozilla.org/pub') davs_fs, path = opener.parse('http://user:pass@host:port/webdav') s3_fs, path = opener.parse('s3://mybucket/some/folter')
  • 12. Multi-filesystem (read-only) from fs.osfs import OSFS from fs.multifs import MultiFS themed_template_fs = MultiFS() themed_template_fs.addfs('templates', OSFS('templates')) themed_template_fs.addfs('theme', OSFS('theme')) -- templates |-- snippets | `-- panel.html |-- index.html |-- profile.html `-- base.html -- theme |-- snippets | |-- widget.html | `-- extra.html |-- index.html `-- theme.html
  • 13. Multi-filesystem (read-only) from fs.osfs import OSFS from fs.multifs import MultiFS themed_template_fs = MultiFS() themed_template_fs.addfs('templates', OSFS('templates')) themed_template_fs.addfs('theme', OSFS('theme')) -- templates |-- snippets | `-- panel.html |-- index.html |-- profile.html `-- base.html -- theme |-- snippets | |-- widget.html | `-- extra.html |-- index.html `-- theme.html |-- snippets | |-- panel.html | |-- widget.html | `-- extra.html |-- index.html |-- profile.html |-- base.html `-- theme.html
  • 14. Implementing drivers/
 essential methods open() Opens a file for read/writing isfile() Check whether the path exists and is a file isdir() Check whether a path exists and is a directory listdir() List the contents of a directory makedir() Create a new directory remove() Remove an existing file removedir() Remove an existing directory rename() Atomically rename a file or directory getinfo() Return information about the path e.g. size, mtime
  • 15. Implementing drivers/
 non-essential methods copy() Copy a file to a new location copydir() Recursively copy a directory to a new location desc() Return a short descriptive text regarding a path exists() Check whether a path exists as file or directory listdirinfo() Get a directory listing along 
 with the info dict for each entry ilistdir() Generator version of the listdir method ilistdirinfo() Generator version of the listdirinfo method getpathurl() Get an external URL at which the 
 given file can be accessed, if possible getsyspath() Get a file’s name in the local filesystem, if possible getmeta() Get the value of a filesystem meta value, if it exists getmmap() Gets an mmap object for the given resource, if supported hassyspath() Check if a path maps to a system path 
 (recognized by the OS) haspathurl() Check if a path maps to an external URL hasmeta() Check if a filesystem meta value exists move() Move a file to a new location movedir() Recursively move a directory to a new location settimes() Sets the accessed and modified times of a path
  • 17. WebDAV (S)FTP pyfilesystem Plone xmldirector.plonecore Dropbox GDriveAWS S3 Local FS Architecture OwnCloud
 Alfresco
 eXistDB
 BaseX Dropbox Sharepoint Evernote Facebook Flickr Yandex OneDrive many others Driver Driver Driver SMEOtixo DropDav WebDAV native
 protocols native
 protocols Your setup SaaS setup
  • 18. Storage/
 Web Service self-hosted (Privacy) via external SaaS Bridge (limited privacy?) WebDAV 
 (Owncloud, BaseX,
 eXist-DB, Alfresco, etc.) YES YES Amazon S3 YES YES Local filesystem YES NO Dropbox (YES, auth token issues) YES FTP/SFTP (YES, V1.4) YES 4Shared ADrive Alfresco Amazon Cloud Amazon S3 Box CloudMe Copy Cubby Digital Bucket DriveOnWeb Dropbox Dump Truck Evernote FTP Fabasoft Facebook FilesAnywhere Flickr GMX.DE Google Drive HiDrive Huddle LiveDrive Mediencenter MyDrive OneDrive Online FileFolder OwnCloud Picasa SugarSync TrendMicro SafeSync Web.de WebDAV Yandex NO YES pyfilesystem driver options
  • 19. Supported services through 
 3rd party services (example)
  • 20. Further development (Funding) • native Dropbox support (via Dropbox SDK) • NTML authentication support for WebDAV driver • native Sharepoint/Office 365 support (via CMIS, REST, WebDAV NTLM, Microsoft Graph) • anyone interested in funding further drivers?
  • 22. Conclusions • the underlaying storage/filesystem is just a configuration option • same code will work across different storage types • unit-test your pyfilesystem-based code against used storage types • minor behavioral differences between drivers • dealing with OAuth (Dropbox, Google Drive)
  • 23. pyfilesystem > pip install fs https://pyfilesystem.readthedocs.org/ https://github.com/revolunet/pyfilesystem