在两个文件中找到类似的列

时间:2018-03-31 11:27:21

标签: python comparison

我正在使用python并且我想编写一个代码,它只比较两个第一列(0:1),如果另一个文件在0和1列中具有相同的值,那么该行应该合并写入一个新文件。

例如: enter image description here

或以人为例:

enter image description here 我现在的代码是这个,但它不是很好

f1 = open('f1.txt','r')
f2 = open('f2.txt','r')
f3 = open('f12.txt','w')


f1_readlines = f1.readlines()
f1_linenum = len(f1_readlines)


f2_readlines = f2.readlines()
f2_linenum = len(f2_readlines)

i=0
while(i<f1_linenum):
    j=0
    while(j<f2_linenum):
        if(f1_readlines[0:1] == f2_readlines[0:1]):
            print(f1_readlines[i])
            f12.write(f1_readlines[i])
        j = j + 1
    i = i + 1

f1.close()
f2.close()
f12.close()

3 个答案:

答案 0 :(得分:1)

您的代码有什么问题?

好的......使用while循环并不是最好的。你可以这样做:

f1 = open('f1.txt','r')
f1_readlines = f1.readlines()
for ln in f1_readlines:
    print ln,

(编辑)此代码:

f1_readlines=[[10, 10, 10], [20, 20, 20], [30, 30, 30]]
f2_readlines=[[20, 20, 25], [30, 30, 11], [25, 25, 55], [44, 44, 58]]
f12=[]

for f1e in f1_readlines:
  for f2e in f2_readlines:
    if f1e[0]==f2e[0] and f1e[1]==f2e[1]:
      f1e.append(f2e[2])
      f12.append(f1e)
      break

for e in f12:
  print e

给出:

[20, 20, 20, 25]
[30, 30, 30, 11]

答案 1 :(得分:1)

这是一个使用两个未分类文件执行所需操作的算法。该算法的优点是只需要存储器中的一个文件,并且其时间复杂度在输入文件的长度之和上是线性的。换句话说,该算法使用少量内存和时间 - 许多其他算法将占用更多空间或时间。 (@dede的答案似乎运行良好,比我的简单,但它使用更多的内存和更多的时间,这对于大型输入文件非常明显。)

首先,逐行读取第一个文件,然后从中构建一个字典。每个键是一行中前两个项的元组,相应的值是该行的其余部分。在您的第二个示例中,生成的字典将是

{('Brad', 'Pitt'): 'cherries', ('Angelina', 'Jolie'): 'bred', ('Jack', 'Nicholson'): 'apples', ('Nicole', 'Kidman'): 'cucumber'}

然后创建一个空输出文件并逐行读取第二个输入文件。对于每一行,您将看到前两个项是否在字典中。如果是这样,请将所需的行打印到输出文件。如果没有,请不要对该行做任何事情。

你对内存的主要用途就是字典。您只能逐行浏览每个输入文件,因此速度很快。这种方法的主要弱点是输出文件将按照第二个输入文件中的项目顺序排列,这是第二个示例中的顺序。如果您需要第一个输入文件的顺序,只需交换两个输入文件的用法。

这是我的算法代码。此版本假定每个输入行正好有三个项目,用空格或制表符分隔。如果一行中的“第三项”可能包含空格或制表符,则代码需要复杂一点。使用您的示例输入文件,此代码的结果正是您想要的。

def similar_columns(filenameinput1, filenameinput2, filename_output):
    """Find the similar columns in two files.
    This assumes each line has exactly three items.
    """
    # Build a dictionary of the items in the first input file
    items_dict = {}
    with open(filenameinput1, 'r') as inputfile1:
        for line in inputfile1:
            col0, col1, oldcolrest = line.split()
            items_dict[(col0, col1)] = oldcolrest

    # Compare the items in the second input file, saving matches
    with open(filenameinput2, 'r') as inputfile2,  \
         open(filename_output, 'w') as outputfile:
        for line in inputfile2:
            col0, col1, newcolrest = line.split()
            oldcolrest = items_dict.get((col0, col1), None)
            if oldcolrest is not None:
                outputfile.write('{} {} {} {}\n'.format(
                        col0, col1, oldcolrest, newcolrest))

similar_columns('f1.txt', 'f2.txt', 'f12.txt')
similar_columns('shop1.txt', 'shop2.txt', 'total.txt')

答案 2 :(得分:1)

我试图以天真的方式解决它

f1 = open('f1.txt','r')
f2 = open('f2.txt','r')
f3 = open('fusion.txt','w')

# read f1 lines from file
f1_readlines = f1.readlines()
# get f1 length
f1_linenum = len(f1_readlines)

# read f2 lines from file
f2_readlines = f2.readlines()
# get f2 length
f2_linenum = len(f2_readlines)

for f1_line in f1_readlines:
    arr1 = f1_line.split(" ")
    c11 = arr1[0]
    c12 = arr1[1]

    for f2_line in f2_readlines:
        arr2 = f2_line.split(" ")
        c21 = arr2[0]
        c22 = arr2[1]
        if((c11 == c21) & (c12 == c22)):
            output = [c11,c12]

            for c in arr1[2:]:
                s = c.strip("\n")
                output.append(s)

            for c in arr2[2:]:
                s = c.strip("\n")
                output.append(s)

            for num in output[0:len(output)-1]:
                f3.write(num)
                f3.write(" ")
            f3.write(output[len(output)-1])
            f3.write("\n")

f1.close()
f2.close()
f3.close()

F1

10 10 25
20 20 20 
11 11 11 
23 23 23 
56 66 55 
78 56 56 7 
77 77 77 

F2

10 10 55
77 77 77
20 22 20
11 13 11
2 23 23
56 66 55 99
78 56 56  

融合

10 10 25 55
56 66 55 55 99
78 56 56 7 56
77 77 77 77

希望这可以解决它:)