#python #wget #shutil #python-os
#python #wget #shutil #python-os
Вопрос:
Я хочу сделать следующее, если папка не существует, затем создайте ее, но если я выполню свой скрипт (во второй раз), очевидно, это уже будет, поэтому мне нужно удалить папку и загрузить файл внутри, но мой текущий скрипт перезаписывает местоположение и demo
становится файлом, как я могу сделать это?
import os, shutil, wget
base_path = os.path.dirname(os.path.abspath(__file__))
directory = os.path.join(base_path, 'demo')
# check for extraction directories existence
if not os.path.isdir(directory):
os.makedirs(directory)
else:
if os.path.exists(directory) and os.path.isdir(directory):
shutil.rmtree(directory)
#os.makedirs(directory)
remote_location = 'https://github.com/facebookresearch/SING/blob/master/sing/nsynth/examples.json.gz?raw=true'
try:
wget.download(remote_location, out=directory)
except:
pass
Комментарии:
1.Проверка, существует ли каталог, а затем попытка создать его, если его нет, создает условие гонки: какой-то другой процесс может создать его после
isdir
возвратаFalse
, но до вашего вызоваmakdirs
. Лучшим подходом является вызовmakedirs
, но игнорирование исключения, вызванного, если оно уже существует.2. Добавлено, как загрузить abd, а также как прочитать его в json
Ответ №1:
Используется pathlib
при работе с путями и папками
from pathlib import Path
import requests
DIR_PATH = Path(__file__).parent / "demo"
# create dir_path if it does not exist
Path(DIR_PATH).mkdir(parents=True, exist_ok=True)
URL = "https://github.com/facebookresearch/SING/blob/master/sing/nsynth/examples.json.gz?raw=true"
response = requests.get(URL, stream=True)
with open(f"{DIR_PATH}/example.json.gz", "wb") as h:
for data in response.iter_content():
h.write(data)
Объяснение:
Path(__file__).parent
возвращает каталог (родительский), к которому вызывается скрипт python. With pathlib
/
используется так же, как и в Linux. Мы добавляем «демо» и создаем его, если он не существует.
Используя запросы, мы получаем файл и помещаем его в нашу папку с помощью потоковой передачи.
Чтобы прочитать файл, мы разархивируем его и загрузим в json
import json
import gzip
from pathlib import Path
DIR_PATH = Path(__file__).parent / "demo"
with gzip.open(f"{DIR_PATH}/example.json.gz", 'rb') as gz:
json_data = json.load(gz)
Комментарии:
1. а что, если я использую
wget.download
его, он будет автоматически удаляться при каждой загрузке?2. Используйте
requests
или другие библиотеки https. Смотрите обновления
Ответ №2:
file_name = "new_file.ext" # Needs A file name!
# Otherwise we'll just overwrite the directory
if not os.path.exists(directory):
os.makedirs(directory) # Create folder if it doesn't exist
file_location = os.path.join(directory, file_name) # Create the actual file location from our file name
remote_location = 'https://github.com/facebookresearch/SING/blob/master/sing/nsynth/examples.json.gz?raw=true'
try:
wget.download(remote_location, out=file_location)
except:
pass
Комментарии:
1. Не проверяйте, существует ли каталог; попробуйте создать его и проигнорируйте исключение, если оно уже существует.
2. Значение проверки того, существует ли она в первую очередь, заключается в том, чтобы разрешить некоторый тип увеличения именования имени каталога или даже возможность отменить загрузку. Однако в большинстве случаев я согласен
3. это именно то, что у меня есть. Я хочу создать, если не существует> загрузить, и если существует папка / файл, удалить с помощью shutil.rmtree (путь) и воссоздать снова