S系列·向文本文件新增数据并且不添加重复值

Python爬虫与数据挖掘

共 2133字,需浏览 5分钟

 · 2022-06-10


S系列·向文本文件新增数据并且不添加重复值

S又称水,亦可读作Small,在日常工作学习过程中,偶尔会发现之前没有看见的、小的、有趣的操作,或许这些操作对于当下的问题解决并无意义,仍然想记录下来,或许能以单独写成一篇完整的文章,则作为流水账似的记下。

系列文章说明:

S系列·<<文章名称>>

平台:

  • windows 10.0

  • python 3.8

目的

向文本文件(可能不存在)新增一列数据并且文本文件中的数据不重复。

处理方法

  • 文本文件不存在
data = ['243''122''782''577''478''334''334''738''122''112''634']

需要保存的数据如上,其中字符串'122'和'334'均有重复值,可以在保存前进行去重处理。

data2 = list(set(data))

上述使用了set函数进行去重,如果需要保持原顺序,则可按以下方式进行排序,或者自拟函数进行去重。

data2.sort(key=data.index)

文件不存在可以使用mode='w'模式,可指定encoding='utf-8'编码进行保存。

with open('test.txt''w', encoding='utf-8'as f:
    f.write('\n'.join(data2) + '\n')
  • 文本文件存在

假设已经存在test.txt文件,且其内容如上,需要将新数据(如下)新增至文本文件中。

new = ['243''122''989''989''577''159']

这里需要解决两个问题:

  1. 新增的数据本身需要去重

  2. 新增的数据与已有的数据也需要做去重处理

观察来看,'989'是一个重复值,而'243', '122', '577'已经存在了,即只需要将一个'989'和'159'新增至test.txt中。

new = ['243''122''989''989''577''159']

with open('test.txt', encoding='utf-8'as f:
    data_list = []
    r_data = f.readline()
    while r_data.strip():
        data_list.append(r_data.strip())
        r_data = f.readline()

new2 = list(set(new).difference(set(data_list)))
new2.sort(key=new.index)

with open('test.txt''a', encoding='utf-8'as f:
    f.write('\n'.join(new2) + '\n')

第一个with open先将文本文件的内容读取出来,使用逐行读取的方式,减少内存使用,并且在每行读取的时候去除换行符,若一次性读取仍然需要处理换行符,综合考虑下使用逐行读取的方式,再将需要新增的数据与已有数据进行判断仅在new中出现的数据,在第二个with open采用mode='a'方式将需要新增的数据写入至文本中。

需要分开用两个open来进行读写,稍有麻烦,可以将mode设置为a+,在新增的模式上还能够读出数据。

new = ['243''122''989''989''577''159''777']

with open('test.txt''a+', encoding='utf-8'as f:
    f.seek(0)  # 将文件游标置于文件开头
    data_list = []
    r_data = f.readline()
    while r_data.strip():
        data_list.append(r_data.strip())
        r_data = f.readline()

    new2 = list(set(new).difference(set(data_list)))
    new2.sort(key=new.index)
    f.write('\n'.join(new2) + '\n')

跟上一方法对比,除open的数量减少为一个外,需要将对比去重的代码移至with open之内,使用'a'模式打开,会默认将文件的游标处于文本最后,使新增数据在末尾处新增,每次使用read,游标会后移,在使用readline时也是可以读到文件的最后,由于a模式游标在最后,直接使用read是无法将已有数据读出,需要使用seek,将游标置于文本开头处,这时再进行read就能按设想的方式读出已有的数据,再将需要新增的数据进行去重比较,写入。

总结

如何将数据新增至已有文本中,并且不含重复数据,从文件不存在入手,逐步递增,最终使用a+模式写入,兼并了文件不存在的情况,将游标设置在开头,将已存在的数据顺利读取,再做去重处理,并未考虑其他因素,在代码设计方面可能存在纰漏。

如凶猛鹰隼,桀骜不驯。


2022.6.7留



浏览 10
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报