Как я могу воссоздать папку при каждой загрузке?

#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 (путь) и воссоздать снова