我想将多个特定链接(图片网址)下载到txt文件(或任何文件中,所有链接都可以列在彼此之下)。
我得到了它们,但是代码在另一个顶部的每个链接上都存在,最后它只保留一个链接:(。我也不想重复网址
def dlink(self, image_url):
r = self.session.get(image_url, stream=True)
with open('Output.txt','w') as f:
f.write(image_url + '\n')
答案 0 :(得分:3)
最简单的问题是打开模式'w'
的文件会截断任何现有文件。您应该将'w'
更改为'a'
。这将打开一个现有的文件进行写入,但是追加而不是截断。
更基本的是,问题可能是您在循环中反复打开文件。这是非常低效的。您使用的方法唯一真正有用的方法是,如果您的程序接近操作系统对打开文件数量的限制。如果不是这种情况,我建议将循环放在with
块中,将模式保持为'w'
,因为您现在只打开一次文件,并将打开的文件传递给{{1功能。
答案 1 :(得分:2)
修改
我的错误,因为它是一种方法,你会多次调用它,如果你以写模式('w')或类似方式打开它,它将覆盖现有文件(如果文件存在)。 因此,如果您使用'a'方式,您可以看到:
打开要追加的文件。文件指针位于文件的末尾 如果文件存在。也就是说,文件处于追加模式。如果 文件不存在,它会创建一个新文件进行编写。
image_url中的其他问题radics是一个列表,所以你需要逐行编写它:
def dlink(self, image_url):
r = self.session.get(image_url, stream=True)
with open('Output.txt','a') as f:
for url in list(set(image_url)):
f.write(image_url + '\n')
另一种方法:
your_file = open('Output.txt', 'a')
r = self.session.get(image_url, stream=True)
for url in list(set(image_url)):
your_file.write("%s\n" % url)
your_file.close() #dont forget close it :)
答案 2 :(得分:2)
文件打开模式错误,' w'模式使每次打开时都会覆盖此文件,而不是附加到该文件。将其替换为' a'模式。
您可以看到此https://stackoverflow.com/a/23566951/8178794了解更多详情
答案 3 :(得分:0)
使用选项w
打开一个文件,如果是existring,则覆盖该文件,使用模式a
将数据附加到现有文件。
尝试:
import requests
from os.path import splitext
# use mode='a' to append result without erasing filename
def dlink(url, filename, mode='w'):
r = requests.get(url)
if r.status_code != 200:
return
# here the link is valid
with open(filename, mode) as desc:
desc.write(url)
def dimg(img_url, img_name):
r = requests.get(img_url, stream=True)
if r.status_code != 200:
return
_, ext = splitext(img_url)
with open(img_name + ext, 'wb') as desc:
for chunk in r:
desc.write(chunk)
dlink('https://image.flaticon.com/teams/slug/freepik.jpg', 'links.txt')
dlink('https://image.flaticon.com/teams/slug/freepik.jpg', 'links.txt', 'a')
dimg('https://image.flaticon.com/teams/slug/freepik.jpg', 'freepik')