【问题标题】:Python searching through a txt file for urls [duplicate]Python通过txt文件搜索url [重复]
【发布时间】:2019-01-24 19:57:45
【问题描述】:

我在我的脚本中使用循环将大量 url 写入这样的 txt 文件:

fwrite = open('visited.txt', 'a')
fwrite.write('\n{0}'.format(url))
fwrite.close()

然后当我稍后重新运行时,我不想处理访问过的链接,所以我这样做:(访问是新/旧 url 的列表)

for x in visit:
    if x in open('visited.txt').read().lstrip('\r\n'):
        visit.remove(x)
    else:
        continue

但这总是会跳过一半的行。如果有 1000 个 url,它只删除其中的 500 个。尝试了 lstrip/rtsrip\n\r\n 但无法管理它

【问题讨论】:

  • "您正在修改对象 visit 的内容,当您执行 visit.remove(x) 时正在迭代该对象" -- 不要那样做
  • 另外,你不应该打开visited.txt文件,每次你想添加一个url时写一行并关闭它。要么使用with open('visited.txt', 'a') as f: f.write('{0}\n'.format(url)),要么在一个列表中收集所有需要的url并将其写入文件一次。

标签: python


【解决方案1】:

这是Python for loop skipping every other loop? 的副本,但为了清楚起见,这里有一个解决方案:

with open('visited.txt') as f:
    visited = f.read().splitlines()

visit = [url for url in visit if url not in visited]

顺便说一句,您的第一个 sn-p 使用上下文管理更容易,我重新排列了 \n,因为换行符是行 终止符,而不是 分隔符,尤其是在类 Unix 操作系统:

with open('visited.txt', 'a') as fwrite:
    fwrite.write('{0}\n'.format(url))

【讨论】:

  • 我不得不使用 f.read().sptlilines() 但感谢您的回答,它解释了很多
  • @ggnoredo 欢迎您!我忘记了readlines 包含换行符,所以我编辑了那个位。
【解决方案2】:

仅将这些行读入列表一次:

with open('visited.txt', 'r') as f:
    visited = f.readlines()

如果您希望只保留非访问者,您可以将两个列表都转换为集合并从另一个中减去一个,然后再转换回列表:

non_visited = list(set(visit) - set(visited))

【讨论】:

  • 仍然得到一半
  • 我编辑了不正确的答案,现在试试。
  • 感谢您的建议,但这是一个完全随机的列表。我的意思是列表应该是有序的,但这使它随机
  • 哦,你没有说这个。在这种情况下,@wjandrea 答案将起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 2018-02-24
  • 2019-03-20
  • 2016-11-13
  • 2017-04-13
  • 2014-04-03
相关资源
最近更新 更多