рдЖрдкрдХреЛ рдкрд╛рдерд▓реАрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░рд╛! рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ рдкреИрдерд▓рд┐рдм рдФрд░ рдЗрд╕рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП , рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреИрдерд▓рд┐рдм рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИ ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдирдП рдкрд╛рдпрдерди рдлреАрдЪрд░реНрд╕ рдкрд░ рдмрд╣реБрдд рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ asyncio,: = рдСрдкрд░реЗрдЯрд░ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ :: рдПрдХ рдЧрдВрднреАрд░ рдирд╡рд╛рдЪрд╛рд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ) рдПрдХ рд░рдбрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд╖рд╛ рдЧрдВрднреАрд░ рдирд╡рд╛рдЪрд╛рд░ рдирд╣реАрдВ рдмрдирддреА рд╣реИ), рд▓реЗрдХрд┐рди рдПрдХ рднрд╛рд╖рд╛ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╡рд╛рдЪрд╛рд░ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдХ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдкрд░, рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рд╛ ( рдпрд╣рд╛рдВ рдПрдХ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рдЫреЛрдбрд╝рдХрд░), рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред


рдЬрдм рдореИрдВрдиреЗ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рддрддреНрдХрд╛рд▓реАрди рдирдП рдкрд╛рдерд▓рд┐рдм рдореЙрдбреНрдпреВрд▓ рдХреА рдЦреЛрдЬ рдХреА, рддреЛ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЗ рдирд┐рдЪрд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ os.path рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕рд┐рд░реНрдл рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдерд╛ред рдореИрдВ рдЧрд▓рдд рдерд╛ред pathlib рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрджреНрднреБрдд рд╣реИ !


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ pathlib рдкреНрдпрд╛рд░ рдореЗрдВ рдкрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ pathlib ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рдкрд╛рдпрдерди рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ pathlib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pathlib ред



рднрд╛рдЧ 1


os.path рдЕрдЬреАрдм рд╣реИ


os.path рдореЙрдбреНрдпреВрд▓ рд╣рдореЗрд╢рд╛ рд╡рд╣реА рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдордиреЗ рддрдм рдХрд┐рдпрд╛ рдерд╛ рдЬрдм рдпрд╣ рдкрд╛рдпрдерди рд░рд╛рд╕реНрддреЛрдВ рдкрд░ рдЖрдпрд╛ рдерд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХрд╛ рд╕рдм рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдпрд╣ рдмрд╣реБрдд рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред


рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?


 import os.path BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) TEMPLATES_DIR = os.path.join(BASE_DIR, 'templates') 

рдпрд╛ рддреЛ?


 from os.path import abspath, dirname, join BASE_DIR = dirname(dirname(abspath(__file__))) TEMPLATES_DIR = join(BASE_DIR, 'templates') 

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ join рдлрдВрдХреНрд╢рди рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо рд╣реЛ, рдФрд░ рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


 from os.path import abspath, dirname, join as joinpath BASE_DIR = dirname(dirname(abspath(__file__))) TEMPLATES_DIR = joinpath(BASE_DIR, 'templates') 

рдореЗрд░реЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╡рд┐рдХрд▓реНрдк рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИрдВред рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдЧрд▓реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реБрдЖ рдХрд┐ рдЙрди рд╕рднреА рдореЗрдВ рд░рд╛рд╕реНрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрднреА рднреА рд╕рд┐рд░реНрдл рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред


os.path рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдЕрдВрджрд░ рд╕реЗ рдмрд╛рд╣рд░ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдЗрди рдХреЙрд▓ рдХреЛ рдиреЗрд╕реНрдЯреЗрдб рд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣реА рд╡рд╣ pathlib рдЬреЛ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ!


 from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent TEMPLATES_DIR = BASE_DIR.joinpath('templates') 

os.path рдореЙрдбреНрдпреВрд▓ рдХреЛ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди pathlib рд╣рдореЗрдВ рд╕рдорддреБрд▓реНрдп рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде Path рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рдХреЙрд▓ рдХреА рдЪреЗрди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ред


рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ: рдмрдВрдж рдХрд░реЛ, рдпреЗ Path рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╣рд▓реЗ рдЬреИрд╕реЗ рдирд╣реАрдВ рд╣реИрдВ, рд╣рдо рдЕрдм рдкрде рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ! рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗ (рд╕рдВрдХреЗрдд: рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпреЗ рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд┐рдирд┐рдореЗрдп рд╣реИрдВ)ред


os рдУрд╡рд░рд▓реЛрдбреЗрдб


рдХреНрд▓рд╛рд╕рд┐рдХ os.path рдореЙрдбреНрдпреВрд▓ рдкрде рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдкрде рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ), рддреЛ рдЖрдкрдХреЛ рджреВрд╕рд░реЗ рдореЙрдбреНрдпреВрд▓ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЕрдХреНрд╕рд░ os ред


os рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реЛрддрд╛ рд╣реИ: mkdir , getcwd , chmod , stat , remove , rename , rmdir ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ chdir , link , walk , listdir , makedirs , renames , removedirs , removedirs , removedirs ред рдФрд░ рд╕рд╛рдорд╛рди рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЧреБрдЪреНрдЫрд╛ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ: fork , putenv , getlogin , getlogin , getlogin , system , ... рдХреБрдЫ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рдЪреАрдЬреЗрдВ рдЬреЛ рдореИрдВ рдпрд╣рд╛рдВ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред


os рдореЙрдбреНрдпреВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдпрд╣ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЬреБрдбрд╝реА рд╣рд░ рдЪреАрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдРрд╕рд╛ рдмреЙрдХреНрд╕ рд╣реИред os рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдЕрдХреНрд╕рд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЙрдХрд╕рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПред


pathlib рдЕрдзрд┐рдХрд╛рдВрд╢ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ Path рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред


рдпрд╣рд╛рдБ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ src/__pypackages__ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ src/__pypackages__ рд╣рдорд╛рд░реА .editorconfig рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓ src/.editorconfig :


 import os import os.path os.makedirs(os.path.join('src', '__pypackages__'), exist_ok=True) os.rename('.editorconfig', os.path.join('src', '.editorconfig')) 

рдпрд╣рд╛рдВ Path рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдорд╛рди рдХреЛрдб рд╣реИ


 from pathlib import Path Path('src/__pypackages__').mkdir(parents=True, exist_ok=True) Path('.editorconfig').rename('src/.editorconfig') 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреВрд╕рд░рд╛ рдХреЛрдб рдирдореВрдирд╛ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реИ - рдпрд╣ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд╣реИред


glob рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛


рдХреЗрд╡рд▓ os рдФрд░ os.path рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ glob рдмрд╛рд░реЗ рдореЗрдВ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЬрд┐рд╕реЗ рдмреЗрдХрд╛рд░ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрдЯрд░реНрди рджреНрд╡рд╛рд░рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП glob.glob рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 from glob import glob top_level_csv_files = glob('*.csv') all_csv_files = glob('**/*.csv', recursive=True) 

pathlib рдореЙрдбреНрдпреВрд▓ рднреА рдЗрд╕реА рддрд░рд╣ рдХреЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:


 from pathlib import Path top_level_csv_files = Path.cwd().glob('*.csv') all_csv_files = Path.cwd().rglob('*.csv') 

pathlib рдореЙрдбреНрдпреВрд▓ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, glob рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИ : рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Path рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рд╣реИ


pathlib рд╕рд░рд▓ рдЪреАрдЬреЛрдВ рдХреЛ рдФрд░ рднреА рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ


pathlib рдХрдИ рдХрдард┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рд░рд▓ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рдФрд░ рднреА рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ ред


рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рднреА рдкрд╛рда рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?


рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рдордЧреНрд░реА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмреНрд▓реЙрдХ рдХреЗ with рдлрд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 from glob import glob file_contents = [] for filename in glob('**/*.py', recursive=True): with open(filename) as python_file: file_contents.append(python_file.read()) 

рдпрд╛ рдЖрдк Path рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ read_text рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 from pathlib import Path file_contents = [ path.read_text() for path in Path.cwd().rglob('*.py') ] 

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдлрд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реЛ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?


рдпрд╣рд╛рдБ рдпрд╣ open рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


 with open('.editorconfig') as config: config.write('# config goes here') 

рдпрд╛ рдЖрдк write_text рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 Path('.editorconfig').write_text('# config goes here') 

рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдХреЛ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП open рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ Path рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ open рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:


 from pathlib import Path path = Path('.editorconfig') with path.open(mode='wt') as config: config.write('# config goes here') 

рдпрд╛, Python 3.6 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдЖрдк рдЕрдкрдиреЗ Path рд╕реАрдзреЗ open рд▓рд┐рдП рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 from pathlib import Path path = Path('.editorconfig') with open(path, mode='wt') as config: config.write('# config goes here') 

рдкрде рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░ рдХреНрдпрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ? рдЙрдирдХреЗ рдЕрд░реНрде рдХрд╛ рдЕрд░реНрде рдХреНрдпрд╛ рд╣реИ?


 person = '{"name": "Trey Hunner", "location": "San Diego"}' pycon_2019 = "2019-05-01" home_directory = '/home/trey' 

рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдПрдХ рд░реЗрдЦрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд░реНрде рд╣реИрдВ: рдкрд╣рд▓рд╛ JSON рд╣реИ, рджреВрд╕рд░рд╛ рддрд╛рд░реАрдЦ рд╣реИ, рдФрд░ рддреАрд╕рд░рд╛ рдлрд╝рд╛рдЗрд▓ рдкрде рд╣реИред


рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдпрд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИ:


 from datetime import date from pathlib import Path person = {"name": "Trey Hunner", "location": "San Diego"} pycon_2019 = date(2019, 5, 1) home_directory = Path('/home/trey') 

JSON рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рдбрд┐рд╕реЗрд░реНрдмрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдбреЗрдЯреНрд╕ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ datetime.date рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдкрде рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ Path рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


Path рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХрд╛ рдХреЛрдб рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рддрд╛рд░реАрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк date рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдкрдереЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ Path рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рдореИрдВ OOP рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╕рдорд░реНрдердХ рдирд╣реАрдВ рд╣реВрдВред рдХрдХреНрд╖рд╛рдПрдВ рдЕрдореВрд░реНрддрддрд╛ рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рдд рдЬреЛрдбрд╝рддреА рд╣реИрдВ, рдФрд░ рдЕрдореВрд░реНрдд рдХрднреА-рдХрднреА рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ pathlib.Path рдПрдХ рдЙрдкрдпреЛрдЧреА рдЕрдореВрд░реНрдд рд╣реИ ред рдмрд╣реБрдд рдЬрд▓реНрджреА, рдпрд╣ рдПрдХ рд╕реНрд╡реАрдХреГрдд рдирд┐рд░реНрдгрдп рдмрди рдЬрд╛рддрд╛ рд╣реИред


PEP 519 рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, Path рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдмрди рдЬрд╛рддреЗ рд╣реИрдВред рдкрд╛рдпрдерди 3.6 рдХреЗ рд╕рдордп, рдЕрдзрд┐рдХрд╛рдВрд╢ os , shutil , os.path рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рд╕рд╣реА os.path рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдЖрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА, pathlib рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!


pathlib рдореЗрдВ рдХреНрдпрд╛ рдХрдореА рд╣реИ?


рд╣рд╛рд▓рд╛рдВрдХрд┐ pathlib рд╢рд╛рдВрдд рд╣реИ, рдпрд╣ рд╡реНрдпрд╛рдкрдХ рдирд╣реАрдВ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ ред


рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ, рд╡рд╣ рд░рд╛рд╕реНрддреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдХрдореА рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдлрд╝рд╛рдЗрд▓ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдХреЙрдкреА / рдбрд┐рд▓реАрдЯ / рдореВрд╡рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Path рдХреЛ shutil рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдЙрдиреНрд╣реЗрдВ Path рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред


рдЗрд╕рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 from pathlib import Path from shutil import copyfile source = Path('old_file.txt') destination = Path('new_file.txt') copyfile(source, destination) 

os.chdir рдкрджреНрдзрддрд┐ рдХрд╛ рдХреЛрдИ рдПрдирд╛рд▓реЙрдЧ рднреА рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 from pathlib import Path from os import chdir parent = Path('..') chdir(parent) 

os.walk рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд░рд╛рдмрд░ рднреА рдирд╣реАрдВ рд╣реИред рдпрджреНрдпрдкрд┐ рдЖрдк рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрдард┐рдирд╛рдИ рдХреЗ рдмрд┐рдирд╛ walk рдХреА рднрд╛рд╡рдирд╛ рдореЗрдВ рдЕрдкрдирд╛ рдХрд╛рд░реНрдп рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдПрдХ рджрд┐рди pathlib.Path рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рддрд░реАрдХреЗ рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рднреА, рдореБрдЭреЗ os.path рдФрд░ рдЕрдиреНрдп рд╕рднреА os.path рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдФрд░ рдХреЗ рд╕рд╛рде pathlib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ ред


рдХреНрдпрд╛ pathlib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ?


рдкрд╛рдпрдерди 3.6 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдкрде рд▓рдЧрднрдЧ рд╣рд░ рдЬрдЧрд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдкрд╛рдпрдерди 3.6 рдФрд░ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ pathlib рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ ред


рдпрджрд┐ рдЖрдк рдкрд╛рдпрдерди 3 рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд┐рд╕реА рднреА рд╕рдордп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Path рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдкрдХреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рджреЗрд╢ рдореЗрдВ рд▓реМрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


 from os import chdir from pathlib import Path chdir(Path('/home/trey')) #   Python 3.6+ chdir(str(Path('/home/trey'))) #      

рднрд╛рдЧ 2. рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдмред


рдкрд╣рд▓рд╛ рднрд╛рдЧ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рдХреБрдЫ рдкреНрд░рд╢реНрди рдереЗред рдХрд┐рд╕реА рдиреЗ рдХрд╣рд╛ рдХрд┐ рдореИрдВрдиреЗ os.path рдФрд░ pathlib рдмреЗрдИрдорд╛рдиреА рд╕реЗ рддреБрд▓рдирд╛ рдХреА рд╣реИред рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдХрд╣рд╛ рдХрд┐ os.path рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╛рдпрдерди рд╕рдореБрджрд╛рдп рдореЗрдВ рдЗрддрдирд╛ os.path рд╣реБрдЖ рд╣реИ рдХрд┐ рдПрдХ рдирдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рдореИрдВрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдкреНрд░рд╢реНрди рднреА рджреЗрдЦреЗред


рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рдЗрди рдореБрджреНрджреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЗрд╕реЗ pathlib рдкреНрд░реЛрдЯреЗрдХреНрд╢рди рдФрд░ рдкреАрдИрдкреА 519 рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╡ рд▓реЗрдЯрд░ рджреЛрдиреЛрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП os.path рдФрд░ pathlib рддреБрд▓рдирд╛ рдХрд░реЗрдВ


рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдХреЛрдб рдЕрдВрд╢реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреА:


 import os import os.path os.makedirs(os.path.join('src', '__pypackages__'), exist_ok=True) os.rename('.editorconfig', os.path.join('src', '.editorconfig')) 

 from pathlib import Path Path('src/__pypackages__').mkdir(parents=True, exist_ok=True) Path('.editorconfig').rename('src/.editorconfig') 

рдпрд╣ рдПрдХ рдЕрдиреБрдЪрд┐рдд рддреБрд▓рдирд╛ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ os.path.join рдХрд╛ рдЙрдкрдпреЛрдЧ os.path.join рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рд╕рд╣реА рд╕реАрдорд╛рдВрдХрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдореИрдВрдиреЗ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрде рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ


рд╣рдо Path рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 >>> str(Path('src/__pypackages__')) 'src\\__pypackages__' 

рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд╝рд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо joinpath рдореЗрдердб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдкрде рд▓рд╛рдЗрди рдореЗрдВ '/' , / рдСрдкрд░реЗрдЯрд░ ( Path рдХреА рдПрдХ рдФрд░ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛), рдпрд╛ Path constructor рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрд░реНрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ:


 >>> Path('src', '.editorconfig') WindowsPath('src/.editorconfig') >>> Path('src') / '.editorconfig' WindowsPath('src/.editorconfig') >>> Path('src').joinpath('.editorconfig') WindowsPath('src/.editorconfig') >>> Path('src/.editorconfig') WindowsPath('src/.editorconfig') 

рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдиреЗ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдХреБрдЫ рднреНрд░рдо рдкреИрджрд╛ рдХрд┐рдпрд╛, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ pathlib рдХрд┐ рдкрде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ \ / рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ pathlib ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ!


Path рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рдЕрдм рд╕реНрд▓реИрд╢ рдХреА рджрд┐рд╢рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: / рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕рднреА рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛрдЧрд╛ред


рдЖрдкрдХреЛ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рдпрджрд┐ рдЖрдк рд▓рд┐рдирдХреНрд╕ рдпрд╛ рдореИрдХ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЧрд▓рддреА рд╕реЗ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдмрдЧ рдХреЛ рдЬреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╡рд░реНрддрдорд╛рди рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╕реНрд▓реИрд╢ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП os.path.join рдФрд░ \ рдпрд╛ os.path.normcase рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдирд┐рдЧрд░рд╛рдиреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ ред


рдпрд╣рд╛рдБ рд╡рд┐рдВрдбреЛрдЬ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 import sys import os.path directory = '.' if not sys.argv[1:] else sys.argv[1] new_file = os.path.join(directory, 'new_package/__init__.py') 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдРрд╕рд╛ рдХреЛрдб рд╣рд░ рдЬрдЧрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛:


 import sys from pathlib import Path directory = '.' if not sys.argv[1:] else sys.argv[1] new_file = Path(directory, 'new_package/__init__.py') 

рдкрд╣рд▓реЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрдереЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдерд╛, рдЬреИрд╕реЗ рдкрд╛рдпрдерди 2 рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдерд╛ рдХрд┐ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдпреВрдирд┐рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рдЕрдм рдЖрдкрдХрд╛ рдХрд╛рдо рдирд╣реАрдВ рд╣реИ - Path рдЖрдкрдХреЗ рд▓рд┐рдП рдРрд╕реА рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред


рдореИрдВ рд╡рд┐рдВрдбреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рдВрдбреЛрдЬ рдХрдВрдкреНрдпреВрдЯрд░ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЬреЛ рдореЗрд░реЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рд╡реЗ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗред


рдпрджрд┐ рдХреЛрдИ рдореМрдХрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЪрд▓реЗрдЧрд╛, рддреЛ рдЖрдкрдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ pathlib рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ : рдЬрдм рднреА рдлрд╝рд╛рдЗрд▓ рдкрде рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ Path рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рд╢рд╛рдВрдд рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ pathlib рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ!


рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдмрдбрд╝рд╛ рдХреЛрдб рдмреЗрд╕ рд╣реИ рдЬреЛ рдкрде рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред pathlib рд╕реНрд╡рд┐рдЪ рдХреНрдпреЛрдВ рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛?


рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рд╣реИрдВ:


 import os import os.path def make_editorconfig(dir_path): """Create .editorconfig file in given directory and return filename.""" filename = os.path.join(dir_path, '.editorconfig') if not os.path.exists(filename): os.makedirs(dir_path, exist_ok=True) open(filename, mode='wt').write('') return filename 

рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ .editorconfig рдПрдХ .editorconfig рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:


 >>> import os.path >>> make_editorconfig(os.path.join('src', 'my_package')) 'src/my_package/.editorconfig' 

рдпрджрд┐ рдЖрдк рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ Path рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛:


 >>> from pathlib import Path >>> make_editorconfig(Path('src/my_package')) 'src/my_package/.editorconfig' 

рд▓реЗрдХрд┐рди ... рдХреИрд╕реЗ?


os.path.join Path рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ (рдкрд╛рдпрдерди 3.6 рдХреЗ рдмрд╛рдж рд╕реЗ)ред рд╡рд╣реА os.makedirs рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд open рдлрд╝рдВрдХреНрд╢рди Path рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, shutil Path рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ Path рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдЪреАрдЬреЗрдВ рдЕрдм Path рдФрд░ рддрд╛рд░ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП PEP 519 рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдиреЗ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ os.PathLike рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдФрд░ рдШреЛрд╖рдгрд╛ рдХреА рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдкрдереЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рдЕрдм рддрд╛рд░ рдФрд░ Path рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкрде, рдорд╛рдирдХ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ!


рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХрд╛ Path рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдорд╛рдирдХ рдПрдХ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рд╢рд╛рдпрдж рдЖрдк рдЙрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, django-environ , path.py , plumbum рдФрд░ visidata рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЕрдкрдиреА Path рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВред рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ pathlib рд╕реЗ рдкреБрд░рд╛рдиреЗ рд╣реИрдВ, рдФрд░ pathlib рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рдкрде рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред PEP 519 рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдФрд░ рд╕реНрдЯреНрд░реИ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ред


рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк pathlib рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ Path рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ, рдФрд░ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред PEP 519 рдХреЗ рд╕рд╛рде, рдЖрдк Path рдХрд╛ рдЕрдкрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ __fspath__ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░реЗрдВ


Path рдХрд╛ рдХреЛрдИ рднреА рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдм рдореВрд▓ рд░реВрдк рд╕реЗ рдкрд╛рдпрдерди рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдкрде рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЛ pathlib рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рддрдереНрдп рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ Path рд╕рд╛рде рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдкреНрд▓рд╕ рд╣реИ


рд▓реЗрдХрд┐рди pathlib.Path рдФрд░ str рд╕рд╣реА рдорд┐рд╢реНрд░рдг рдирд╣реАрдВ рд╣реИ?


рдЖрдк рд╢рд╛рдпрдж рд╕реЛрдЪрддреЗ рд╣реИрдВ: рдпрд╣ рд╕рдм, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрднреА-рдХрднреА рд▓рд╛рдЗрди-рдПрдВрдб-рдХрднреА-рдкрде рдХреЗ рд╕рд╛рде рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛?


рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рд╣рд╛рдВ, рдХреБрдЫ рд╣рдж рддрдХ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИред


PEP 519 рдиреЗ PathLike рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░ рдЪреАрдЬреЗрдВ PathLike : рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХрд┐рд╕реА рднреА PathLike рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ рдХрд┐рд╕реА PathLike рдХреЛ Path рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред


рдЖрдЗрдП рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓реЗрдВ - рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ Path (рдпрд╛ рдЬреЛ рднреА fspath рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╣реИ):


 from pathlib import Path import os.path p1 = os.path.join('src', 'my_package') p2 = Path('src/my_package') 

os.fspath рдлрд╝рдВрдХреНрд╢рди рджреЛрдиреЛрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ:


 >>> from os import fspath >>> fspath(p1), fspath(p2) ('src/my_package', 'src/my_package') 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, Path рдЗрди рджреЛрдиреЛрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ Path рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ:


 >>> Path(p1), Path(p2) (PosixPath('src/my_package'), PosixPath('src/my_package')) 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЖрдк make_editorconfig рд╡рд╛рдкрд╕ Path рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:


 >>> from pathlib import Path >>> Path(make_editorconfig(Path('src/my_package'))) PosixPath('src/my_package/.editorconfig') 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди make_editorconfig рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ pathlib рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред


pathlib рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИ


рдореИрдВрдиреЗ pathlib рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдмрд╛рд░ рджреЗрдЦрд╛ рд╣реИред рдпрд╣ рд╕рдЪ рд╣реИ - pathlib рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдЬрд╛рд░реЛрдВ Path рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдмрдирд╛рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рдореИрдВрдиреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ pathlib рдФрд░ os.path рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рдкрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рднреА .py рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ .py


рдпрд╣рд╛рдБ os.walk рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:


 from os import getcwd, walk extension = '.py' count = 0 for root, directories, filenames in walk(getcwd()): for filename in filenames: if filename.endswith(extension): count += 1 print(f"{count} Python files found") 

рдФрд░ рдпрд╣рд╛рдБ Path.rglob рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:


 from pathlib import Path extension = '.py' count = 0 for filename in Path.cwd().rglob(f'*{extension}'): count += 1 print(f"{count} Python files found") 

рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рдХрд╛рдлреА рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ 10 рдмрд╛рд░ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреАред


рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ 97507 рдлрд╛рдЗрд▓реЗрдВ рдорд┐рд▓реАрдВ рдЬрд┐рдирдореЗрдВ рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛рдпрд╛ рдерд╛ред рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдиреЗ 1.914 рд╕реЗрдХрдВрдб рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛, рджреВрд╕рд░рд╛ рд╡рд╛рд▓рд╛ 3.430 рд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реБрдЖред


рдЬрдм рдореИрдВрдиреЗ extension='' рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛, рддреЛ рдЗрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рд▓рдЧрднрдЧ 600,000 рдлрд╛рдЗрд▓реЗрдВ рдорд┐рд▓рддреА рд╣реИрдВ, рдФрд░ рдЕрдВрддрд░ рдмрдврд╝рддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо 1.888 рд╕реЗрдХрдВрдб рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рджреВрд╕рд░рд╛ 7.485 рд╕реЗрдХрдВрдб рдореЗрдВред


рдЗрд╕рд▓рд┐рдП, рдореЗрд░реЗ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдкрд░, pathlib рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП pathlib рд▓рдЧрднрдЧ рджреЛрдЧреБрдирд╛ рд╣реИ , рдФрд░ рдЪрд╛рд░ рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реИ ред pathlib рдФрд░ os рдмреАрдЪ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдЕрдВрддрд░ рд╡реНрдпрд╛рдкрдХ рд╣реИред


рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЧрддрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрдЬрд╛ рдФрд░ 6 рд╕реЗрдХрдВрдб рдЦреЛ рджрд┐рдПред рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ 10 рдорд┐рд▓рд┐рдпрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ, рддреЛ рдореИрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдЬрдмрдХрд┐ рдРрд╕реА рдХреЛрдИ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдб рдХрд╛ рдПрдХ рдЧрд░реНрдо рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдФрд░ pathlib рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдХреЛрдб рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдПрдХ рдЕрдбрд╝рдЪрди рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╕рдордп рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд░реНрдмрд╛рджреА рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рдХрд╛рд╕ рдХреЗ рдмрд┐рдирд╛ рдЦрд░рд╛рдм рдкрдардиреАрдп рдХреЛрдб рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред


рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░


рдореИрдВ pathlib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ pathlib рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдЗрд╕ рдзрд╛рд░рд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореИрдВрдиреЗ рдХреЛрдб рдХреЗ рдХреБрдЫ рдЫреЛрдЯреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓рд┐рдпрд╛ рдЬреЛ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ pathlib рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЖрдкрдХреЗ рдиреНрдпрд╛рдпрд╛рд▓рдп рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд┐рдирд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ - рдпрд╣ рддрдп рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ред


рдпрд╣рд╛рдБ make_editorconfig рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдерд╛:


 import os import os.path def make_editorconfig(dir_path): """Create .editorconfig file in given directory and return filename.""" filename = os.path.join(dir_path, '.editorconfig') if not os.path.exists(filename): os.makedirs(dir_path, exist_ok=True) open(filename, mode='wt').write('') return filename 

рдФрд░ рдпрд╣рд╛рдБ pathlib рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:


 from pathlib import Path def make_editorconfig(dir_path): """Create .editorconfig file in given directory and return filepath.""" path = Path(dir_path, '.editorconfig') if not path.exists(): path.parent.mkdir(exist_ok=True, parent=True) path.touch() return path 

рдпрд╣рд╛рдБ рдПрдХ рд╕рд╛рдВрддреНрд╡рдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рд▓реЗрддрд╛ рд╣реИ рдФрд░ .gitignore рдлрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдореМрдЬреВрдж рд╣реИ:


 import os.path import sys directory = sys.argv[1] ignore_filename = os.path.join(directory, '.gitignore') if os.path.isfile(ignore_filename): with open(ignore_filename, mode='rt') as ignore_file: print(ignore_file.read(), end='') 

pathlib рд╕рд╛рде рдПрдХ рд╣реА рдмрд╛рдд:


 from pathlib import Path import sys directory = Path(sys.argv[1]) ignore_path = directory / '.gitignore' if ignore_path.is_file(): print(ignore_path.read_text(), end='') 

рдпрд╣рд╛рдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдлрд╝реЛрд▓реНрдбрд░ рдФрд░ рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ:


 from collections import defaultdict from hashlib import md5 from os import getcwd, walk import os.path def find_files(filepath): for root, directories, filenames in walk(filepath): for filename in filenames: yield os.path.join(root, filename) file_hashes = defaultdict(list) for path in find_files(getcwd()): with open(path, mode='rb') as my_file: file_hash = md5(my_file.read()).hexdigest() file_hashes[file_hash].append(path) for paths in file_hashes.values(): if len(paths) > 1: print("Duplicate files found:") print(*paths, sep='\n') 

рд╕реА pathlib рд╕рд╛рде рдПрдХ рд╣реА рдмрд╛рдд:


 from collections import defaultdict from hashlib import md5 from pathlib import Path def find_files(filepath): for path in Path(filepath).rglob('*'): if path.is_file(): yield path file_hashes = defaultdict(list) for path in find_files(Path.cwd()): file_hash = md5(path.read_bytes()).hexdigest() file_hashes[file_hash].append(path) for paths in file_hashes.values(): if len(paths) > 1: print("Duplicate files found:") print(*paths, sep='\n') 

, , -, . pathlib .


pathlib.Path


.


/ pathlib.Path . , .


 >>> path1 = Path('dir', 'file') >>> path2 = Path('dir') / 'file' >>> path3 = Path('dir/file') >>> path3 WindowsPath('dir/file') >>> path1 == path2 == path3 True 

Python (. open ) Path , , pathlib , !


 from shutil import move def rename_and_redirect(old_filename, new_filename): move(old, new) with open(old, mode='wt') as f: f.write(f'This file has moved to {new}') 

 >>> from pathlib import Path >>> old, new = Path('old.txt'), Path('new.txt') >>> rename_and_redirect(old, new) >>> old.read_text() 'This file has moved to new.txt' 

pathlib , , PathLike . , , , PEP 519 .


 >>> from plumbum import Path >>> my_path = Path('old.txt') >>> with open(my_path) as f: ... print(f.read()) ... This file has moved to new.txt 

pathlib , ( , ), , .


, pathlib . Python :


 from pathlib import Path gitignore = Path('.gitignore') if gitignore.is_file(): print(gitignore.read_text(), end='') 

pathlib тАФ . !

Source: https://habr.com/ru/post/hi453862/


All Articles