我从.dat文件中获取值并将这些值写入txt文件中。问题是有重复的价值观。以下是txt文件中的示例输出:
1001
1002
1003
1003
1004
1005
如何删除或合并1003值并将其保存在我创建的新txt文件中?这是我目前的代码:
for line in fi:
if "CA002" in line:
txt = fi.next()
print txt #view values
file = open("Reference.txt", "a+")
file.write(txt)
try:
read = file.readlines()
read = list(set(read))
read.sort()
print read
finally:
file.close()
我不确定我写的是不是。有人说使用set()函数来合并重复值。但我不认为这样做。有什么建议?原谅我的代码,我才开始学习python的基础知识。谢谢!
最终结果应该是这样的文本文件:
1001
1002
1003
1004
1005
答案 0 :(得分:3)
您可以使用set
容器检查副本然后写入文件,也可以使用with
打开文件,不要使用python类型名称作为更加pythonic方式变量名!:
with open("Reference.txt", "a+") as f,open("input.dat") as fi :
seen=set()
for line in fi:
if "CA002" in line:
txt = fi.next()
print txt #view values
seen.add(txt)
if not txt in seen :
f.write(txt)
如果您在2.6中,则不能对多个项目使用With
语句,因此您可以这样做:
with open("Reference.txt", "a+") as f :
with open("input.dat") as fi:
seen=set()
for line in fi:
if "CA002" in line:
txt = fi.next()
print txt #view values
seen.add(txt)
if not txt in seen :
f.write(txt)
答案 1 :(得分:2)
使用with
打开文件,不要一直打开文件并附加,在循环外打开一次。您可以使用OrderedDict和生成器表达式来编写唯一元素并保持顺序:
from collections import OrderedDict
with open("input.dat") as f, open("Referenced.txt","w") as out:
filtered = OrderedDict.fromkeys(next(f, "") for line in f if "CA002" in line)
out.writelines(filtered.iterkeys()) # .keys() python3
为了将来参考,您可以在文件对象上调用set。 set(file)
与set(file.readlines())
相同。 a+
打开reading
和writing/appending
的文件,如果您要创建文件并只使用w
编写。
答案 2 :(得分:0)
由于您的重复值只是连续出现而我认为 input.dat 的读取值已经排序,您可以这样做一个简单的事情:
written = ''
with open("Reference.txt", "a+") as f :
with open("input.dat") as fi:
for line in fi:
if "CA002" in line:
current = fi.next()
if current != written:
f.write(current)
written = current
因此,如果它与之前刚写过的值不同,则只写入值。