提问人:ProtocolGuy 提问时间:11/14/2023 更新时间:11/14/2023 访问量:116
下载并保存文件,而无需知道其扩展名
Download and save file without knowing its extension
问:
我对 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)
答:
-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}")
评论