如何使用Python 3.7下载多个文件

如何使用Python 3.7下载多个文件,python,python-3.x,http,Python,Python 3.x,Http,一个初学者的问题-我有一个.txt文件,其中包含要下载的.html文件列表。文件的内容如下所示: http://www.example.com/file1.html http://www.example.com/file2.html http://www.example.com/file3.html 我可以使用下面的代码让Python下载单个文件,但我希望它从.txt文件中读取每个URL并下载每个.html文件 import urllib.request url = 'http://www.e

一个初学者的问题-我有一个.txt文件,其中包含要下载的.html文件列表。文件的内容如下所示:

http://www.example.com/file1.html
http://www.example.com/file2.html
http://www.example.com/file3.html
我可以使用下面的代码让Python下载单个文件,但我希望它从.txt文件中读取每个URL并下载每个.html文件

import urllib.request
url = 'http://www.example.com/file1.html'
urllib.request.urlretrieve(url, '/users/user/Downloads/file1.html')

有没有一种简单的方法可以做到这一点?

首先,您必须将.txt文件作为可以迭代的内容来读取。然后,您可以使用for循环逐个遍历url链接:

with open('file.txt') as f:
   for line in f:
      url = line
      path = 'your path'+url.split('/', -1)[-1]
      urllib.request.urlretrieve(url, path.rstrip('\n'))
import os

urls = open('pages.txt', 'r')
for i, url in enumerate(urls):
    path = '/users/user/Downloads/{}'.format(os.path.basename(url)
    urllib.request.urlretrieve(url, path)
    

您可以使用ThreadPool或ProcessingPool进行并发,如


你试过什么?也许可以阅读一些关于如何使用for loops的教程,您可以使用enumerate而不是i=0和i+=1,您可以尝试从中获取文件名http://www.example.com/file1.html 创建“/users/user/Downloads/file1.html”是的,您的解决方案确实更优化,谢谢:DThanks。如上所述,我收到一条错误消息,其中Python正在读取.txt文件中的换行符,好像它们是URL的一部分:OSError:[Errno 22]无效参数:'/users/user/Downloads/file1.html\n'。有什么办法克服这个问题吗?“\n”表示它在路径上添加了新行。一个简单的path.rstrip就可以解决这个问题,这正是我想要的方法。我在倒数第二行的末尾添加了缺少的括号,但仍然收到一条错误消息,Python正在读取.txt文件中的换行符,好像它们是URL的一部分:OSError:[Errno 22]无效参数:'/users/user/Downloads/file1.html\n'。有没有办法克服这个问题?
import requests
from multiprocessing.pool import ThreadPool

def download_url(url):
  print("downloading: ",url)
  # assumes that the last segment after the / represents the file name
  # if url is abc/xyz/file.txt, the file name will be file.txt
  file_name_start_pos = url.rfind("/") + 1
  file_name = url[file_name_start_pos:]

  r = requests.get(url, stream=True)
  if r.status_code == requests.codes.ok:
    with open(file_name, 'wb') as f:
      for data in r:
        f.write(data)
  return url


urls = ["https://jsonplaceholder.typicode.com/posts",
        "https://jsonplaceholder.typicode.com/comments",
        "https://jsonplaceholder.typicode.com/photos",
        "https://jsonplaceholder.typicode.com/todos",
        "https://jsonplaceholder.typicode.com/albums"
        ]

# Run 5 multiple threads. Each call will take the next element in urls list
results = ThreadPool(5).imap_unordered(download_url, urls)
for r in results:
    print(r)