Так делать плохо:
my_path = root + '/' + user + '/' + filename
Потому что:
- В разных ОС – разные разделители пути: ‘/’ для nix-подобных и macOS, ‘\\’ для Windows
- В компонентах могут быть или не быть слеши – легко допустить ошибку
- Набирать это даже не удобно (имхо)
Самый простой способ правильного склеивания путей – os.path.join выберет нужный разделитель и расставит его как надо:
my_path = os.path.join(root, user, filename)
Есть еще более современный и удобный способ, который также поставляется в стандартной библиотеке Python – модуль pathlib. Это библиотека для работы с путями и файлами в стиле ООП. Примечательно, что объект Path поддерживает оператор /, который собственно и склеивает пути:
my_path = Path(root) / user / filename
У класса Path есть куча методов для получения путей в разных форматах, извлечения компонент пути, получении инфо о файлах и папках и много другое. Вот лишь некоторые из них:
>>> Path('~').expanduser() PosixPath('/Users/bob') >>> Path('~/../../usr').expanduser().resolve() PosixPath('/usr') >>> Path.cwd() PosixPath('/Users/bob') >>> Path('/usr/bin/foo').parts ('/', 'usr', 'bin', 'foo') >>> Path('my/library.tar.gar').suffixes ['.tar', '.gar'] >>> Path('my/library.tar.gar').parent PosixPath('my') >>> str(Path('/usr/bin/foo')) '/usr/bin/foo' >>> sorted(Path('Projects/playground_python').glob('*.py')) [PosixPath('Projects/playground_python/btc_gen.py'), PosixPath('Projects/playground_python/getattr.py'), ...] >>> Path('test.txt').touch() >>> Path('test.txt').exists() True >>> Path('test.txt').is_file() True >>> Path('test.txt').is_dir() False >>> Path('test.txt').is_symlink() False >>> Path('temp/1/foo').mkdir(parents=True, exist_ok=True) >>> Path('temp/1/foo').resolve().as_uri() 'file:///Users/bob/temp/1/foo' >>> Path('temp/1/foo').rmdir()
И еще очень много всего!
🤩 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway! 👈