python3.4.3下逐行读入txt文本并去重的方法


Posted in Python onApril 29, 2018

读写文件时应注意的问题包括:

1.字符编码

2.操作完成即时关闭文件描述符

3.代码兼容性

几种方法:

#!/bin/python3
original_list1=[" "]
original_list2=[" "]
original_list3=[" "]
original_list4=[" "]
newlist1=[" "]
newlist2=[" "]
newlist3=[" "]
newlist4=[" "]
newtxt1=""
newtxt2=""
newtxt3=""
newtxt4=""
#first way to readline
f = open("duplicate_txt.txt","r+")    # 返回一个文件对象  
line = f.readline()           # 调用文件的 readline()方法 
while line:  
  original_list1.append(line)          
  line = f.readline()  
f.close() 
#use "set()" remove duplicate str in the list
# in this way,list will sort randomly
newlist1 = list(set(original_list1))
#newlist1 = {}.fromkeys(original_list1).keys() #faster 
#rebuild a new txt 
newtxt1="".join(newlist1)
f1 = open("noduplicate1.txt","w")
f1.write(newtxt1)
f1.close()
###################################################################
#second way to readline
for line in open("duplicate_txt.txt","r+"):  
  original_list2.append(line)
newlist2 = list(set(original_list2))
newlist2.sort(key=original_list2.index)         #sort
#newlist2 = sorted(set(original_list2),key=l1.index)  #other way
newtxt2="".join(newlist2)
f2 = open("noduplicate2.txt","w")
f2.write(newtxt2)
f2.close()
###################################################################
#third way to readline
f3 = open("duplicate_txt.txt","r")  
original_list3 = f3.readlines()       #读取全部内容 ,并以列表方式返回 
for i in original_list3:          #遍历去重
  if not i in newlist3:
      newlist3.append(i)
newtxt3="".join(newlist3)
f4 = open("noduplicate3.txt","w")
f4.write(newtxt3)
f4.close()
###################################################################
#fourth way
f5 = open('duplicate_txt.txt',"r+") 
try: 
  original_list4 = f5.readlines() 
  [newlist4.append(i) for i in original_list4 if not i in newlist4]
  newtxt4="".join(newlist4)
  f6 = open("noduplicate4.txt","w")
  f6.write(newtxt4)
  f6.close()
finally: 
  f5.close()

结果:

去重前:

python3.4.3下逐行读入txt文本并去重的方法

去重后(无序):

python3.4.3下逐行读入txt文本并去重的方法

去重后(有序):

python3.4.3下逐行读入txt文本并去重的方法

总结

这段下程序涉及文件读写操作以及链表List的操作,文章开头提到的几个问题,由于并没有使用中文,所以不关心编码,但这里还是要提一提:

f = open("test.txt","w")
f.write(u"你好")

上面这段代码如果在python2中运行会报错

python3.4.3下逐行读入txt文本并去重的方法

报错是因为程序没办法直接保存unicode字符串,要经过编码转换成str类型的二进制字节序列才可以保存。

write()方法会自动编码转换,默认使用ascii编码格式,而ascii不能处理中文,所以出现UnicodeEncodeError。

正确方式是在调用write()方法前,手动格式转换,用utf-8或者gbk转换成str。

f = open("test.txt","w")
text=u"你好"
text=text.encode(encoding='utf-8')
f.write(text)

关于close()问题:

不关闭会有什么影响呢?操作完成后,不关闭文件,会对系统资源造成浪费,因为系统可打开的文件描述符数量是有限的。Linux是65535。

一般来说close之后就OK了,但是也会存在特殊情况,比如说,在调用open()函数时就已经发生错误,权限不足,调用close()肯定报错。还有一种是在write()时,如果磁盘空间不足,报错,close()就没有机会执行了。正确的做法就是使用 try except 对异常进行捕获:

f = open("test.txt","w")
try:
  text=u"你好"
  text=text.encode(encoding='utf-8')
  f.write(text)
except: IOError as e:
  print("oops,%s"%e.args[0])
finally:
  f.close()

更优雅的写法是用 with…as。

with open("test.txt","w") as f:
  text=u"你好"
  f.write(text.encode(encoding='utf-8'))

文件对象实现上下午管理器协议,程序进入with语句时,会把文件对象赋值给变量f,在程序退出with时会自动的调用close()方法。

关于兼容性问题:

python2和python3的open()函数是不一样的,后者可以在函数中指定字符编码格式。

如何解决python2和python3的兼容open()问题呢?

使用io模块下的open()函数,python2中的io.open等价与python3的open函数

from io import open
with open("test.txt","w",encoding='utf-8') as f:
  f.write(u"你好")

以上这篇python3.4.3下逐行读入txt文本并去重的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python发布模块的步骤分享
Feb 21 Python
web.py获取上传文件名的正确方法
Aug 26 Python
在Django的form中使用CSS进行设计的方法
Jul 18 Python
Python抓取电影天堂电影信息的代码
Apr 07 Python
Python过滤列表用法实例分析
Apr 29 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
Tensorflow 卷积的梯度反向传播过程
Feb 10 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
flask框架中的cookie和session使用
Jan 31 Python
Python使用re模块实现信息筛选的方法
Apr 29 #Python
Python排序算法之选择排序定义与用法示例
Apr 29 #Python
Python实现的直接插入排序算法示例
Apr 29 #Python
Python实现的堆排序算法示例
Apr 29 #Python
Python中实现变量赋值传递时的引用和拷贝方法
Apr 29 #Python
分享一下Python数据分析常用的8款工具
Apr 29 #Python
Python随机函数random()使用方法小结
Apr 29 #Python
You might like
php入门小知识
2008/03/24 PHP
php防盗链的常用方法小结
2010/07/02 PHP
PHP Curl多线程原理实例详解
2013/11/06 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
调试php程序的简单步骤
2019/10/04 PHP
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
python中精确输出JSON浮点数的方法
2014/04/18 Python
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
便捷提取python导入包的属性方法
2018/10/15 Python
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
初学者学习Python好还是Java好
2020/05/26 Python
Python几种常见算法汇总
2020/06/02 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
体育教育个人自荐信范文
2013/12/01 职场文书
教师档案管理制度
2014/01/23 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js