python - 如果数据不存在,如何将数据插入文本文件(Python)
问题描述
我正在尝试在 Python 中创建一个网页抓取脚本,在其中我跟随一堆链接并将它们插入到 .txt 文件中。但是,只有当文件中不存在该网站时,我才想这样做。
到目前为止,我已经编写了这段代码来将给定的网站链接插入到文件中(不工作):
def writeSite(site):
file = open("websites.txt", 'a+')
# print(site)
if site in file.read():
return
file.write(site + "\n")
file.close()
提前致谢。
解决方案
您非常接近,但是因为您打开文件以追加到它,它以文件指针结尾开始。您需要重新开始阅读其内容:
def writeSite(site):
file = open("websites.txt", 'a+')
file.seek(0)
# print(site)
if site in file.read():
return
file.write(site + "\n")
file.close()
但是,请记住,这site in file.read()
是非常粗糙的。
例如,假设您已经'http://somesite.com/page/'
在文件中,但现在要添加'http://somesite.com/'
- 整个 URL 不在文件中,但您的测试会找到它。
如果您想检查整行(并确保很好地处理文件),这会更好:
def writeSite(site):
site += '\n'
with open("websites.txt", 'a+') as f:
f.seek(0)
if site in f.readlines():
return
f.write(site)
它在站点名称中添加一个换行符以分隔文件中的 URL,并使用 readlines 来利用该事实来检查整个 URL。使用with
确保文件总是被关闭。
而且由于您无论如何都想在写入之前阅读,因此您可以将'r+'
其用作一种模式,并跳过搜索 - 但前提是您可以确定文件已经存在。我假设您选择了'a+'
,因为事实并非如此。
(如果您担心这会改变site
- 的值,这仅适用于函数内部的参数。无论您在函数外部传递的任何值都不会受到影响)
推荐阅读
- laravel - 上传文件到sharepoint并返回上传文件的url
- python - 较低的 C 参数值如何在 SVM 模型中带来更好的训练和测试分数?
- math - xPath 中是否有 sign() 函数
- typescript - 赛普拉斯自定义子命令 Typescript
- javascript - 从输入框单击时不更新 setTimeout() 值
- javascript - 如何在来自 API 的给定对象中获取“id”和“text”
- mysql - MySQL 只选择唯一值
- google-cloud-platform - 工作量身份可以工作2个不同的GCP项目吗?
- java - 如何删除“参数分配”不允许检查样式错误?
- r - 使用 Base R 绘制数据子集