My notes compiled on the topic of working with directories, navigating folders and listing files etc.
#Use os.listdir (or os.scandir in >= 3.5) to list items in a single directory, use os.walk (which uses os.listdir or os.scandir in >= 3.5) to list items in a directory tree.
#Using os.walk for only one directory is not as efficient as just using the function it uses internally to do that job.
#os.listdir(path='.')
#os.listdir returns a list of names (files and directories) in a given path
#default value for path when you call os.listdir() is '.'
#so os.listdir() and os.listdir('.') do the same thing, grabbing the current directory
#path can be specified as either str or bytes. If path is bytes, the filenames returned will also be bytes; in all other circumstances the filenames returned will be str.
#What does it mean when the docs say that os.listdir specifically excludes '.' and '..' even if they are present in the directory?
#That concerns the returned values. In UNIX filesystems, every directory has . and .. entries, where . refers to the current directory, and .. to the parent directory. These entries will not be included in the list returned by os.listdir.
#The scandir() function returns directory entries along with file attribute information, giving better performance for many common use cases.
#glob.glob is a wrapper around listdir
import os
#os.getcwd()
#os.chdir("subFolder")
#os.mkdir("My New Folder")
#os.rename("My New Folder", "My New Folder renamed")
#The listdir function takes a pathname and returns a list of the contents of the directory.
print(os.listdir("c:\\Files\\"))
# another way
myfiles = os.listdir("c:\\Files\\")
print(myfiles)
#same thing but using variables.
dirname = "c:\\Files\\"
print(os.listdir(dirname))
#all three list the current directory
print(os.listdir())
print(os.listdir("."))
print(os.listdir("./"))
# print contents of a sub folder in current directory
print(os.listdir("subFolder"), "\n")
#output a list
print(os.listdir("."))
#loop over each item in the list
for name in os.listdir():
print(name)
#or place in variable first
filelist = os.listdir()
#just print the variable contents
print(filelist)
#loop over each item in the variable's list
for name in filelist:
print(name)
#its common to use os.path.join to get full paths
for entry in os.listdir("."):
path = os.path.join(".", entry)
print(path)
#use os.path.isdir() to filter out directories, printing only files
for name in filelist:
if os.path.isdir(name):
continue
print(name)
#os.path.isfile() is an alternative, testing for 'fileness' instead
#so alternatively...
#only files
for x in os.listdir("."):
if os.path.isfile(x):
print(x)
#or
#only directories
for x in os.listdir("."):
if os.path.isdir(x):
print(x)
#a list comprehension using os.path.isfile() to return list of filenames only:
files = [f for f in os.listdir(".") if os.path.isfile(os.path.join(".", f))]
for file in files:
print(file)
#another alternative using filter function
files = filter(os.path.isfile, os.listdir(os.curdir))
print(type(files)) #<class 'filter'>
print(files) #<filter object at 0x032C1BD0>
#loop over the filter object
for file in files:
print(file)
#filter filetypes by using endswith()
for file in os.listdir("./"):
if file.endswith(".jpg"):
print(file)
#using fnmatch we can filter files by type
import fnmatch
listOfFiles = os.listdir('.')
pattern = "*.py"
for entry in listOfFiles:
if fnmatch.fnmatch(entry, pattern):
print(entry)