如何有效地迭代两个文件(25000多行)

时间:2017-03-17 16:33:45

标签: python linux

所以,我正在尝试在Python中组合一个列表来匹配大约25,000行的数据。

第一个列表数据来自文件mac.uid,看起来像这样

Mac|ID

第二个列表数据来自serial.uid,如下所示:

Serial|Mac  
列表1中的

Mac必须等于列表2中的Mac才能加入。

这就是我目前正在做的事情,我相信有太多的重复。

combined = [];

def combineData():
    lines = open('mac.uid', 'r+')
    for line in lines:
        with open('serial.uid', 'r+') as serial:
            for each in serial:
                a, b = line.strip().split('|')
                a = a.lower()
                x, y = each.strip().split('|')
                y = y.lower()
                if a == y:
                    combined.append(a+""+b+""+x)

最终列表应如下所示:

Mac(List1), ID(List1), Serial(List2)

这样我就可以将它导入Excel工作表了。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

而不是你的嵌套循环(导致二次复杂性),你应该使用词典,这将给你大致 O n log(< i> n )复杂性。为此,请先阅读serial.uid 一次,然后将MAC地址的映射存储到dict中的序列号。

serial = dict()

with open('serial.uid') as istr:
    for line in istr:
        (ser, mac) = split_fields(line)
        serial[mac] = ser

然后您可以再次关闭该文件并处理mac.uid查找您刚创建的字典中每个MAC地址的序列号。

combined = list()

with open('mac.uid') as istr:
    for line in istr:
        (mac, uid) = split_fields(line)
        combined.append((mac, uid, serial[mac]))

请注意,我已将combined从字符串列表更改为元组列表。我还将分裂逻辑分解为一个单独的函数。 (当然,你必须在使用之前加上它的定义。)

def split_fields(line):
    return line.strip().lower().split('|')

最后,我建议您开始为变量使用更具描述性的名称。

对于25k行的文件,您应该没有问题将所有内容存储在内存中。如果您的数据集太大,您可能希望开始研究使用数据库。请注意,Python标准库附带SQLite module