77

我有以下网址:

网址 = http://photographs.500px.com/kyle/09-09-201315-47-571378756077.jpg

我想提取这个url中的文件名:09-09-201315-47-571378756077.jpg

获得此文件名后,我将使用此名称将其保存到桌面。

filename = **extracted file name from the url**     
download_photo = urllib.urlretrieve(url, "/home/ubuntu/Desktop/%s.jpg" % (filename))

在此之后,我将调整照片的大小,一旦完成,我将保存调整大小的版本并将单词“_small”附加到文件名的末尾。

downloadedphoto = Image.open("/home/ubuntu/Desktop/%s.jpg" % (filename))               
resize_downloadedphoto = downloadedphoto.resize.((300, 300), Image.ANTIALIAS)
resize_downloadedphoto.save("/home/ubuntu/Desktop/%s.jpg" % (filename + _small))

由此,我想要实现的是获取两个文件,原始照片具有原始名称,然后是具有修改名称的调整大小的照片。像这样:

09-09-201315-47-571378756077.jpg

09-09-201315-47-571378756077_small.jpg

我该怎么做呢?

4

11 回答 11

197

您可以urllib.parse.urlparse使用os.path.basename

import os
from urllib.parse import urlparse

url = "http://photographs.500px.com/kyle/09-09-201315-47-571378756077.jpg"
a = urlparse(url)
print(a.path)                    # Output: /kyle/09-09-201315-47-571378756077.jpg
print(os.path.basename(a.path))  # Output: 09-09-201315-47-571378756077.jpg
于 2013-09-10T19:41:11.363 回答
32

os.path.basename(url)

为什么要更加努力?

In [1]: os.path.basename("https://example.com/file.html")
Out[1]: 'file.html'

In [2]: os.path.basename("https://example.com/file")
Out[2]: 'file'

In [3]: os.path.basename("https://example.com/")
Out[3]: ''

In [4]: os.path.basename("https://example.com")
Out[4]: 'example.com'

说明 2020-12-20

迄今为止,没有人提供完整的解决方案。

URL 可以包含 a?[query-string]和/或 a #[fragment Identifier](但只能按该顺序:ref

In [1]: from os import path

In [2]: def get_filename(url):
   ...:     fragment_removed = url.split("#")[0]  # keep to left of first #
   ...:     query_string_removed = fragment_removed.split("?")[0]
   ...:     scheme_removed = query_string_removed.split("://")[-1].split(":")[-1]
   ...:     if scheme_removed.find("/") == -1:
   ...:         return ""
   ...:     return path.basename(scheme_removed)
   ...:

In [3]: get_filename("a.com/b")
Out[3]: 'b'

In [4]: get_filename("a.com/")
Out[4]: ''

In [5]: get_filename("https://a.com/")
Out[5]: ''

In [6]: get_filename("https://a.com/b")
Out[6]: 'b'

In [7]: get_filename("https://a.com/b?c=d#e")
Out[7]: 'b'
于 2018-08-07T11:49:24.607 回答
22
filename = url[url.rfind("/")+1:]
filename_small = filename.replace(".", "_small.")

也许在最后一种情况下使用“.jpg”,因为 . 也可以在文件名中。

于 2013-09-10T19:39:59.923 回答
12

您可以将 url 拆分为“/”并检索列表的最后一个成员:

    url = "http://photographs.500px.com/kyle/09-09-201315-47-571378756077.jpg"
    filename = url.split("/")[-1] 
    #09-09-201315-47-571378756077.jpg

然后使用replace改变结尾:

    small_jpg = filename.replace(".jpg", "_small.jpg")
    #09-09-201315-47-571378756077_small.jpg
于 2013-09-10T19:52:04.887 回答
8

用于urllib.parse.urlparse仅获取URL 的路径部分,然后pathlib.Path在该路径上使用以获取文件名:

from urllib.parse import urlparse
from pathlib import Path


url = "http://example.com/some/long/path/a_filename.jpg?some_query_params=true&some_more=true#and-an-anchor"
a = urlparse(url)
a.path             # '/some/long/path/a_filename.jpg'
Path(a.path).name  # 'a_filename.jpg'
于 2020-03-10T19:44:58.493 回答
6

使用 python3(从 3.4 开始),您可以pathlib通过以下方式滥用该库:

from pathlib import Path

p = Path('http://example.com/somefile.html')
print(p.name)
# >>> 'somefile.html'

print(p.stem)
# >>> 'somefile'

print(p.suffix)
# >>> '.html'

print(f'{p.stem}-spamspam{p.suffix}')
# >>> 'somefile-spamspam.html'


于 2021-01-03T18:58:53.233 回答
2

有时有一个查询字符串:

filename = url.split("/")[-1].split("?")[0] 
new_filename = filename.replace(".jpg", "_small.jpg")
于 2019-06-10T03:38:10.923 回答
1

使用os包的简单版本:

import os

def get_url_file_name(url):
    url = url.split("#")[0]
    url = url.split("?")[0]
    return os.path.basename(url)

例子:

print(get_url_file_name("example.com/myfile.tar.gz"))  # 'myfile.tar.gz'
print(get_url_file_name("example.com/"))  # ''
print(get_url_file_name("https://example.com/"))  # ''
print(get_url_file_name("https://example.com/hello.zip"))  # 'hello.zip'
print(get_url_file_name("https://example.com/args.tar.gz?c=d#e"))  # 'args.tar.gz'
于 2021-02-17T18:37:37.723 回答
1

有时您拥有的链接可以有重定向(对我来说就是这种情况)。在这种情况下,您必须解决重定向

import requests
url = "http://photographs.500px.com/kyle/09-09-201315-47-571378756077.jpg"
response = requests.head(url)
url = response.url

那么您可以继续目前的最佳答案(Ofir的)

import os
from urllib.parse import urlparse


a = urlparse(url)
print(a.path)                    # Output: /kyle/09-09-201315-47-571378756077.jpg
print(os.path.basename(a.path))  # Output: 09-09-201315-47-571378756077.jpg

但是,它不适用于此页面,因为该页面不再可用

于 2021-10-06T13:08:26.690 回答
0

Python拆分url以查找图像名称和扩展名

帮助您提取图像名称。附加名称:

imageName =  '09-09-201315-47-571378756077'

new_name = '{0}_small.jpg'.format(imageName) 
于 2013-09-10T19:41:12.713 回答
-1

我们可以使用ntpath模块从 url 中提取文件名。

import ntpath
url = 'http://photographs.500px.com/kyle/09-09-201315-47-571378756077.jpg'
name, ext = ntpath.splitext(ntpath.basename(url))
# 09-09-201315-47-571378756077  .jpg


print(name + '_small' + ext)
09-09-201315-47-571378756077_small.jpg
于 2020-07-11T04:43:28.983 回答