下载并保存文件,而无需知道其扩展名

Download and save file without knowing its extension

提问人:ProtocolGuy 提问时间:11/14/2023 更新时间:11/14/2023 访问量:116

问:

我对 Python 很陌生。我需要编写一个脚本来下载多个资产并将它们保存到一个目录中。我有一个 JSON 文件,其中指定了每个资产的 URL。

{
  "asset1": "SOME_URL/ASSET_NAME.png",
  "asset2": "SOME_URL/ASSET_NAME.pdf",
  "asset3": "SOME_URL/ASSET_NAME.jpeg"
}

由于我事先不知道扩展名,因此我目前不确定如何将资产保存到目录中。 我还想事先指定文件名,而不是使用远程文件之一。

我试图这样做,但这显然不是要走的路。

from urllib.request import urlretrieve

for url in [asset_url_1, asset_url_2, asset_url_3]:
  # I would like to already specify the name of the asset
  # What's the extension?
  output_path = "tmp/output/WHAT_TO_PUT_HERE?"
  urlretrieve(url, output_path)
python请求

评论

3赞 buran 11/14/2023
实际上,您知道JSON的扩展...
1赞 buran 11/14/2023
另请检查如何在 python 中找到文件的 mime 类型?
1赞 Nikolaj Š. 11/15/2023
那么你到底想要什么呢?这些文件应该如何下载?

答:

-1赞 Will.Evo 11/14/2023 #1

你可以使用 pathlib 来执行你所要求的操作:

import pathlib

out_dir = pathlib.Path("/some/path/to/save")
asset = pathlib.Path("http://www.someurl.com/asset.json")
out_path = out_dir / asset.with_stem("new_stem").name

评论

0赞 BlackJack 11/15/2023
这并不健壮,因为可能会使用与路径分隔符不同的东西。Path/
0赞 Will.Evo 11/15/2023
@BlackJack '/' 运算符只是除法运算符的覆盖,用于插入路径分隔符。如果您使用的是 Windows,则会插入正确的路径分隔符。
0赞 BlackJack 11/15/2023
我不是在谈论 Python 中的运算符,而是此代码假设您可以使用 URL,就好像它始终是对象的有效路径分隔符一样。/Path/Path
0赞 Will.Evo 11/16/2023
老实说,我不知道为什么我的解决方案被否决了。它解决了问题提出的确切问题。如果发帖人使用的数据看起来像他发布的数据,那么我的解决方案很简单且有效。
0赞 BlackJack 11/17/2023
不,它不是真的。仅当您假定这是路径分隔符时。无论何时何地。将 URL 包装在对象中是错误的。这是一个黑客,而不是一个干净、强大的解决方案。URL 不是文件系统路径。/Path
0赞 Marco Parola 11/14/2023 #2

我通常使用python包来处理fht文件系统os

import os
from urllib.request import urlretrieve
import json

# Load JSON containing your file information
with open('your_json_file.json') as f:
    asset_urls = json.load(f)

# output directory
output_directory = 'tmp/output'

for asset_name, url in asset_urls.items():
    
    file_extension = url.split('.')[-1] # Extract only file extension
    local_name = f"{asset_name}.{file_extension}" # local file name
    output_path = os.path.join(output_directory, local_name) # Construct the full output path
    urlretrieve(url, output_path) # Download 
    print(f"Downloaded {asset_name} to {output_path}")