【问题标题】:Issue with writing multiple lines into a file in python在python中将多行写入文件的问题
【发布时间】:2017-12-02 12:21:17
【问题描述】:

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

【问题讨论】:

  • 输出结果如何?我的意思是,txt
  • txt文件只保留一个链接:s.yimg.com/dh/ap/groups/loader.gif
  • 而参数 image_url 只是一个 url?还是包含所有网址的列表?
  • 所有需要的 url 列表
  • 我明白了,让我知道我的回答是否适合你 :)

标签: python-2.7


【解决方案1】:

使用选项w 覆盖文件(如果存在)打开文件,使用模式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')

【讨论】:

  • 嗨,我认为问题也在于文件的模式,检查其他答案,你会看到:)
【解决方案2】:

编辑

我的一个大错误,因为它是一个方法,你会多次调用它,如果你以写模式('w')或类似的方式打开它,如果文件存在,它将覆盖现有文件。 所以,如果你使用'a'方式,你可以看到:

打开一个文件进行追加。文件指针在文件末尾 如果文件存在。也就是说,文件处于附加模式。如果 文件不存在,它会创建一个新文件进行写入。

image_url中的另一个问题基数是一个列表,所以需要一行一行的写出来:

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 :)

【讨论】:

  • DVoter,我需要一些关于你为什么投反对票的信息,所以我可以看到错误,也可以学习
  • 模式下不需要+
  • @MadPhysicist 是的,谢谢,我注意到阅读更多,我从来没有遇到过这种情况,并没有算作它是一种方法,所以它可以被调用超过有一次,导致这些问题,我编辑了答案
  • 我没有给出任何答案,我很感激他们。现在它可以正常工作了:)
  • @TTT 哈哈不不,我现在你没有做过的用户,但我不知道是谁,但没有必要
【解决方案3】:

问题很简单,以'w' 模式打开文件会截断任何现有文件。您应该改为将 'w' 更改为 'a'。这将打开一个现有文件进行写入,但追加而不是截断。

更根本的是,问题可能是您在循环中一遍又一遍地打开文件。这是非常低效的。您使用的方法可能真正有用的唯一时间是您的程序是否接近操作系统对打开文件数量施加的限制。如果不是这种情况,我建议将循环放在with 块内,保持模式为'w',因为您现在只打开一次文件,并将打开的文件传递给您的dlink 函数。

【讨论】:

  • 我明白了...感谢分享,这里有很好的信息,是教学的加分项
【解决方案4】:

文件打开模式错误,'w'模式使这个文件每次打开都被覆盖,而不是附加到它上面。将其替换为“a”模式。

您可以查看此https://stackoverflow.com/a/23566951/8178794 了解更多详情

【讨论】:

  • 请建议修复
  • 如果问题重复,请将其标记为重复,不要简单地链接到其他答案。
  • 不错的爱雄,我没注意到如果这不是只执行一次的方法,选择糟糕的文件模式可能是一个巨大的错误,在我看来是一个加分项, OP 从不询问模式
猜你喜欢
  • 2011-09-15
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多