在python中将多行写入文件的问题

时间:2017-06-28 23:56:55

标签: python-2.7

我想将多个特定链接(图片网址)下载到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')

4 个答案:

答案 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')