使用python在文本文件中编写,合并和排序值

时间:2015-04-14 11:08:14

标签: python

我从.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

3 个答案:

答案 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+打开readingwriting/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

因此,如果它与之前刚写过的值不同,则只写入值。