Python

Python je multiplatformní jazyk oblíbený pro svou jednoduchost a stručnost. Jeho hlavní předností je srozumitelná a čistá syntaxe. Díky své jednoduchosti bývá označován jako jeden z nejvhodnějších programovacích jazyků pro začátečníky.

Odkazy na Literaturu k procvičování Pythonu, která je volně dostupná z internetu:

  • Files 1 - pěkný zdroj informací, jak pracovat se soubory v Pythonu
  • Files 2 - další zdroj, tentokráte z dílny fakulty kybernetiky ČVUT
  • Učebnice Pythonu - slovensky

V Pythonu exstuje více způsobů, jak procházet a listovat adresáři. Vypíšu ty nejzákladnější funkce. Listovat můžeme pomocí:

  • funkce Listdir
  • funkce Os.walk
  • funkce Glob

Asi to nejzákladnější a nejvíce používanou funkcí pro listovaní soubory a adresáři je Listdir. Ukázka:

#!/usr/bin/env python3
import os

dirpath = '/data'
os.chdir(dirpath)
path = '%s' % (dirpath)

for file in os.listdir(path):
    #if file.endswith(".*"):
        print(os.path.join(dirpath, file))

V pythonu ještě existuje funkce Scandir, která dělá v podstatě to samé (byla přidaná později).

#!/usr/bin/env python3
import os

### Vypsani filu i adresaru
def my_scandir(dirpath):
    with os.scandir(dirpath) as entries:        # misto with jde pouzit: entries = os.scandir(dirpath) (a vyhodit cyklus)
        for entry in entries:
            print(entry)

### Vylistovani jen souboru
def my_scan_files_in_dir(dirpath):
    with os.scandir(dirpath) as entries:
        for entry in entries:
            if entry.is_file():
                print(entry)

### Vylistovani jen sub-adresaru
def my_scan_dirs_in_dir(dirpath):
    with os.scandir(dirpath) as entries:
        for entry in entries:
            if entry.is_dir():
                print(entry)

### info o mtime u souboru/adresare
def my_scan_mtime_in_dir(dirpath):
    with os.scandir(dirpath) as entries:
        for entry in entries:
            info = entry.stat()
            #print(info.st_mtime)
            print(f'name: {entry.name}\tModified: {convert_date(info.st_mtime)}')

Os.walk se hodí pro rychlé rekurzivní procházení souborové struktury:

#!/usr/bin/env python3
import os

dirpath = '/tmp'
os.chdir(dirpath)
path = '%s' % (dirpath)

import os
for root, dirs, files in os.walk(path):
    for file in files:
        #if file.endswith(".txt"):
             # spojeni cesty a jmena
             print(os.path.join(root, file))

for root, dirs, files in os.walk(path):
    for dir in dirs:
        print(os.path.join(root, dir))

Aby byl návod úplný, zmíním ještě funkci Glob (i když ji osobně nepoužívám):

#!/usr/bin/env python3
import glob
import os

dirpath = '/data'
os.chdir(dirpath)
path = '%s' % (dirpath)

files = glob.glob(path + "**/", recursive=True)
for file in files:
    print(file)

path = '%s' % (dirpath)
dirs = glob.glob(path + "**/*", recursive=True)
for dir in dirs:
    print(dir)

Klasické otevření souboru, a zapsání něčeho:

#!/usr/bin/env python3
def my_read(filepath):
    with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:
        data = f.read()
        print(data)

def my_write(filepath):
     with open(filepath, 'w', encoding='utf-8', errors='ignore') as f:       # pokud chceme do souboru jen pridavat, a ne ho prepisovat, pouzijem "a"
         data = 'a\nbb\nccc\ndddd'
         f.write(data)

if __name__ == '__main__':
    filepath = 'sample.txt'
    data = my_write(filepath)
    data = my_read(filepath)

K založení adresáře budeme potřebovat naimportovaný modul os. Pokud chceme založit jediný adresář pou6ijeme os.mkdir. Jestliže chceme založit adresář včetně podadresářů, používáme os.makedirs.

def my_mkdir(dirpath,dirname):
    import os
    access_rights = 0o755
    try:
        ## one dir
        os.mkdir(f'{dirpath}/{dirname}')
        ## with rights
        #os.mkdir(path, access_rights)
        ## multiple dirs
        #os.makedirs(f'{dirpath}/{dirname}/2018/10/05')
    #except FileExistsError as exc:
    #    print(exc)

if __name__ == '__main__':
    dirpath = '/tmp'
    dirname = 'examples'
    data = my_mkdir(dirpath,dirname)

K mazání adresářů je v Pythonu funkce os.rmdir.

#!/usr/bin/env python3
import os
path = "/tmp/year"
try:
    os.rmdir(path)
except OSError:
    print ("Deletion of the directory %s failed" % path)
else:
    print ("Successfully deleted the directory %s" % path)

Občas pythonista potřebuje získat relativní a absolutní cestu k souboru, aktuální adresář a jiné vhodné proměnné.

def my_absolute_path(filepath):
    import os
    dir_path = os.path.dirname(os.path.realpath(__file__))
    print(dir_path)

print(os.path.basename(fpath))

def my_current_path(dirpath):
    cwd = os.getcwd()

Zde je pár příladů, s určením cest k souborům:

  • The __file__ constant
  • os.path.realpath(path) (returns "the canonical path of the specified filename, eliminating any symbolic links encountered in the path")
  • os.path.dirname(path) (returns "the directory name of pathname path")
  • os.getcwd() (returns "a string representing the current working directory")
  • os.chdir(path) ("change the current working directory to path")
#!/usr/bin/env python3
import os

print("Path at terminal when executing this file")
print(os.getcwd() + "\n")

print("This file path, relative to os.getcwd()")
print(__file__ + "\n")

print("This file full path (following symlinks)")
full_path = os.path.realpath(__file__)
print(full_path + "\n")

print("This file directory and name")
path, filename = os.path.split(full_path)
print(path + ' --> ' + filename + "\n")

print("This file directory only")
print(os.path.dirname(full_path))

Dočasné soubory mohou sloužit k ukládání proměnných. Jejich výhodou je, že když program skončí jsou zrušeny:

#!/usr/bin/env python3

### Nepojmenovane TemporaryFile
def my_tempfile():
    from tempfile import TemporaryFile
    # Create a temporary file and write some data to it. 
    # There is no need to give the temporary file a filename since it will be destroyed after the script is done running.
    fp = TemporaryFile('w+t')
    fp.write('Hello, Nice to meet you universe!')
    # Go back to the beginning and read data from file
    fp.seek(7)
    data = fp.read()
    print(data)
    # Close the file, after which it will be removed, Once the file is closed, it will be deleted from the filesystem.
    fp.close()

### Pojmenovane NamedTemporaryFile
def my_namedTempfile():
    from tempfile import NamedTemporaryFile
    fp = NamedTemporaryFile('w+t')
    name = fp.name
    fp.write('Hello, Nice to meet you universe!')
    fp.seek(7)
    data = fp.read()
    print(data)
    print(f'Jmeno souboru: {name}')
    fp.close()

### Automaticke uvolneni
# TemporaryFile can be used in conjunction with the with statement. Using a context manager takes care of 
# closing and deleting the file automatically after it has been read:
def auto_Tempfile():
    from tempfile import TemporaryFile
    with TemporaryFile('w+t') as tf:
        tf.write('Hello universe!')
        tf.seek(0)
        print(tf.read())

### Docasny adresar (sice nevim k cemu to je dobre, ale pro uplnnost)
def auto_TempDir():
   import tempfile
   import os
   with tempfile.TemporaryDirectory() as tmpdir:
       print('Created temporary directory ', tmpdir)
       os.path.exists(tmpdir)

if __name__ == '__main__':
    #data = my_tempfile()
    #data = my_namedTempfile()
    data = auto_TempDir()
    #data = auto_Tempfile()

Ke smazání souboru pužijeme os.remove:

import os
## If file exists, delete it ##
if os.path.isfile(myfile):
    os.remove(myfile)
else:    ## Show an error ##
    print("Error: %s file not found" % myfile)

Je několik cest, jak zjistit délku souboru, pomocí os.path:

>>> import os
>>> b = os.path.getsize("/path/file.txt")
>>> b
2071611

Pomocí os.seek:

# f is a file-like object. 
f.seek(0, os.SEEK_END)
size = f.tell()