如何从URL中提取文件名并附加一个单词?

noa*_*ale 31 python django

我有以下网址:

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

我想在这个网址中提取文件名:09-09-201315-47-571378756077.jpg

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

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

在此之后,我将调整照片的大小,一旦完成,我将保存调整大小的版本并在文件名的末尾附加单词"_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))
Run Code Online (Sandbox Code Playgroud)

从这个,我想要实现的是获得两个文件,原始照片与原始名称,然后调整大小的照片与修改名称.像这样:

09-09-201315-47-571378756077.jpg

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

我该怎么做呢?

Ofi*_*ael 88

您可以使用urlparseos.path内置python模块.例:

import os, sys
PY3 = sys.version_info[0] >= 3
if PY3: #python3
    from urllib.parse import urlparse
else: #python2
    from urlparse 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
Run Code Online (Sandbox Code Playgroud)

如果您无法导入urlparse,请尝试以下操作:

Python 2

import os, sys
PY3 = sys.version_info[0] >= 3
if PY3: #python3
    from urllib.parse import urlparse
else: #python2
    from urlparse 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
Run Code Online (Sandbox Code Playgroud)

Python 3

import os, sys
PY3 = sys.version_info[0] >= 3
if PY3: #python3
    from urllib.parse import urlparse
else: #python2
    from urlparse 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
Run Code Online (Sandbox Code Playgroud)

  • Python 3:`来自urllib.parse import urlparse`,`a = urlparse(url)` (15认同)
  • 你甚至不需要urlparse.`os.path.basename(url)`非常适合. (6认同)
  • @elky一个确实需要urlparse。仅使用urlparse时,带有查询字符串的url如`http://photographs.500px.com/kyle/09-09-201315-47-571378756077.jpg?size = 1000px`会被提取为文件名`09-09- 201315-47-571378756077.jpg`。如果仅使用os.path.basename(url),则提取的文件名将包含查询字符串:09-09-201315-47-571378756077.jpg?size = 1000px`。这通常不是理想的解决方案。 (6认同)
  • 警告:Windows中的os.path可能期望“ \” (2认同)
  • @让-弗朗索瓦T。它不起作用,你只是没有考虑到边缘情况,比如当你有一个百分比编码的“#”时。尝试 `Path(unquote(urlparse('http://example.com/my%20%23superawesome%20picture.jpg').path)).name` 与 `Path(urlparse(unquote('http://example. com/my%20%23superawesome%20picture.jpg')).path).name`。在解析之前盲目修改要解析的内容绝不是一个好主意。 (2认同)

Ric*_*kyA 19

filename = url[url.rfind("/")+1:]
filename_small = filename.replace(".", "_small.")
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,`/ path / to / image27.08.2016.jpg`会变成`image27_small.08_small.2016_small.jpg`。 (3认同)

P i*_*P i 12

os.path.basename(url)

为什么要努力?

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

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

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

In [4]: os.path.basename("https://foo.com")
Out[4]: 'foo.com'
Run Code Online (Sandbox Code Playgroud)

  • 这与接受的解决方案存在相同的问题:url中没有查询字符串,将无法正常工作:os.path.basename('https://example.com/test?view=test')>>'test ?view = test' (5认同)
  • @Pi“到目前为止,没有人提供完整的解决方案”,接受的答案是一个“完整的解决方案”,它抛出了 URL 的“#”和“?”部分,它使用 Python 内置的 URL 解析(可能会处理您没有想到的边缘情况)。 (2认同)
  • @RichLysakowskiPhD Python 3 上不存在“urllib2”和“requests”[在底层使用“urllib.parse”](https://github.com/psf/requests/search?q=urllib)。与导入相比,自己实现 URL 解析的维护负担如何更小? (2认同)

Bry*_*yan 11

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

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

然后replace用来改变结局:

    small_jpg = filename.replace(".jpg", "_small.jpg")
    #09-09-201315-47-571378756077_small.jpg
Run Code Online (Sandbox Code Playgroud)

  • 易于阅读且不使用任何外部包,最佳答案。 (2认同)
  • 对于像github这样的网站,将args添加到网址中,如'?raw = true',这将无效. (2认同)

ccp*_*zza 11

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

\n
from pathlib import Path\n\np = Path(\'http://example.com/somefile.html\')\nprint(p.name)\n# >>> \'somefile.html\'\n\nprint(p.stem)\n# >>> \'somefile\'\n\nprint(p.suffix)\n# >>> \'.html\'\n\nprint(f\'{p.stem}-spamspam{p.suffix}\')\n# >>> \'somefile-spamspam.html\'\n\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x9d\x97\xef\xb8\x8f 警告

\n

pathlib模块不适用于解析 URL \xe2\x80\x94,它仅设计用于 POSIX 路径。不要在生产代码中使用它!对于非关键代码来说,这是一种肮脏的快速破解。也适用于 URL 的事实pathlib可以被视为一个意外,可能会在未来的版本中修复。该代码仅作为示例提供,说明您可以执行但可能不应该执行的操作。如果您需要以规范方式解析 URL,那么更喜欢使用urllib.parse或替代方案。或者,如果您假设域之后和参数+查询+哈希之前的部分被认为是 POSIX 路径,那么您可以使用urllib.parse.urlparse提取路径片段,然后使用pathlib.Path它来操作它。

\n

  • 这会破坏路径后面带有内容的 URL。`Path('http://example.com/somefile.html?some-querystring#some-id').name` 将返回 `'somefile.html?some-querystring#some-id'` (2认同)

Bor*_*ris 7

用于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'
Run Code Online (Sandbox Code Playgroud)