Nano Hash - криптовалюты, майнинг, программирование

Python перебирает два файла, выполняет вычисления, затем выводит 3 файла

Например, у меня есть 2 файла с разделителями табуляции:

файл1:

12  23  43  34
433  435  76  76

файл2:

123  324  53  65
12  457  54  32

Я хотел бы перебрать эти 2 файла, сравнивая каждую строку файла 1 с файлом 2 и наоборот. Если, например, 1-й номер 1-й строки в файле 1 совпадает с 1-м номером 2-й строки в файле 2: я хотел бы поместить из 1-й строки в файле 1 в файл с именем output. затем я хотел бы поместить все строки из файла 1, которые не нашли совпадения в файле 2, в новый файл и все строки из файла 2, которые не нашли совпадения в файле 1, в новый файл.

до сих пор мне удавалось найти совпадающие строки и поместить их в файл, но у меня возникли проблемы с помещением несовпадающих строк в два отдельных файла.

one=open(file1, 'r').readlines()
two=open(file2, 'r').readlines()
output=open('output.txt', 'w')
count=0
list1=[]    #list for lines in file1 that didn't find a match 
list2=[]    #list for lines in file2 that didn't find a match
for i in one:
    for j in two:
        columns1=i.strip().split('\t')
        num1=int(columns1[0])
        columns2=j.strip().split('\t')
        num2=int(columns2[0])
        if num1==num2:
           count+=1
           output.write(i+j)
        else:
           list1.append(i)        
           list2.append(j)

У меня проблема с другой частью. Может ли кто-нибудь показать мне правильный и лучший способ сделать это, я был бы очень признателен.

РЕДАКТИРОВАТЬ: Спасибо за быстрые ответы всем. 3 выхода, которые я бы искал, это:

Output_file1: #Сопоставление результатов между двумя файлами

12 23 43 34 #строка из файла1
12 457 54 32 #строка из файла2

Output_file2: #строки из первого файла, которые не нашли соответствия

433 435 76 76

Output_file3: #строки из второго файла, которые не нашли соответствия

123 324 53 65

11.07.2011

  • Первое значение из первой строки первого файла с первым значением из второй строки второго файла? 11.07.2011
  • Чтобы понять логику того, что вы пытаетесь сделать, не могли бы вы дать три выходных файла, которые вы хотите для двух входных файлов, перечисленных выше? 11.07.2011
  • @Artsiom Rudzenka: Извините за путаницу, я пытался сказать, что в примере, который я привел, это условие или логика для определения совпадения. 11.07.2011

Ответы:


1

Думаю, что это не лучший способ, но он работает для меня и выглядит довольно простым для понимания:

# Sorry but was not able to check code below
def get_diff(fileObj1, fileObj2):
    f1Diff = []
    f2Diff = []
    outputData = []
    # x is one row
    f1Data = set(x.strip() for x in fileObj1)
    f2Data = set(x.strip() for x in fileObj2)
    f1Column1 = set(x.split('\t')[0] for x in f1Data)
    f2Column1 = set(x.split('\t')[0] for x in f2Data)
    l1Col1Diff = f1Column1 ^ f2Column1
    l2Col1Diff = f2Column1 ^ f1Column1
    commonPart = f1Column1 & f2column1
    for line in f1Data.union(f2Data):
        lineKey = line.split('\t')[0]
        if lineKey in common:
            outputData.append(line)
        elif lineKey in l1ColDiff:
            f1Diff.append(line)
        elif lineKey in l2ColDiff:
            f2Diff.append(line)
    return outputData, f1Diff, f2Diff

outputData, file1Missed, file2Missed = get_diff(open(file1, 'r'), open(file2, 'r'))
11.07.2011
  • Нет ли способа вывести все три файла (outputData, file1Missed и file2Missed) за один раз? 13.07.2011
  • @user839145 user839145 я изменил свой код, чтобы он возвращал все три списка одновременно, но я не смог это проверить. Дайте мне знать, если у вас есть какие-либо проблемы с этим 13.07.2011
  • Большое спасибо, Артем, я надеялся, что будет способ изменить последнюю версию вашего кода, потому что мне нужно было сделать больше сравнения, чем просто сравнение только значения. И я не очень знаком с операцией множества. Я буду учиться этому. 13.07.2011
  • Set — это не операция, это тип данных: docs.python .org/library/stdtypes.html#set-types-set-frozenset . Что касается кода - да, моя предыдущая версия также может быть изменена, вы можете связаться со мной, и я постараюсь помочь. 13.07.2011

  • 2

    Я бы посоветовал вам использовать модуль csv для чтения ваших файлов таким образом (возможно, вам придется возиться с диалектом, см. http://docs.python.org/library/csv.html для справки:

    import csv
    one = csv.reader(open(file1, 'r'), dialect='excell')
    two = csv.reader(open(file2, 'r'), dialect='excell')
    

    тогда вам может быть проще «архивировать» по строкам обоих файлов одновременно (см. http://docs.python.org/library/itertools.html#itertools.izip_longest):

    import itertools
    file_match = open('match', 'w')
    file_nomatch1 = open('nomatch1', 'w')
    file_nomatch2 = open('nomatch2', 'w')
    for i,j in itertools.izip_longest(one, two, fillvalue="-"):
        if i[0] == j[0]:
            file_match.write(str(i)+'\n')
        else:
            file_nomatch1.write(str(i)+'\n')
            file_nomatch2.write(str(j)+'\n') 
            # and maybe handle the case where one is "-"
    

    Я перечитал сообщение и понял, что вы ищете совпадение между ЛЮБЫМИ двумя строками в обоих файлах. Возможно, кому-то приведенный выше код покажется полезным, но он не решит вашу конкретную проблему.

    11.07.2011
  • Спасибо, Пэт, я нашел этот пример, и да, он ищет только построчно, но все равно спасибо. 11.07.2011
  • Вместо того, чтобы возиться с диалектом (кстати, я не верю, что есть такой диалект, как 'excell'; это был бы 'excel'), он мог бы просто использовать delimiter='\t'. 11.07.2011

  • 3

    Я бы предложил использовать установить операцию

    from collections import defaultdict
    
    def parse(filename):
        result = defaultdict(list)
        for line in open(filename):
            # take the first number and put it in result
            num = int(line.strip().split(' ')[0])
            result[num].append(line)  
        return result
    
    def select(selected, items):
        result = []
        for s in selected:
            result.extend(items[s])
        return result
    
    one = parse('one.txt')
    two = parse('two.txt')
    one_s = set(one)
    two_s = set(two)
    intersection = one_s & two_s
    one_only = one_s - two_s
    two_only = two_s - one_s
    
    one_two = defaultdict(list)
    for e in one: one_two[e].extend(one[e])
    for e in two: one_two[e].extend(two[e])
    
    open('intersection.txt', 'w').writelines(select(intersection, one_two))
    open('one_only.txt', 'w').writelines(select(one_only, one))
    open('two_only.txt', 'w').writelines(select(two_only, two))
    
    11.07.2011

    4

    Я думаю, что этот код подходит для ваших целей

    one=open(file1, 'r').readlines()
    two=open(file2, 'r').readlines()
    output=open('output.txt', 'w')
    
    first = {x.split('\t')[0] for x in one}
    second = {x.split('\t')[0] for x in two}
    common = first.intersection( second )
    list1 = filter( lambda x: not x.split('\t')[0] in common, one )
    list2 = filter( lambda x: not x.split('\t')[0] in common, two )
    res1 = filter( lambda x: x.split('\t')[0] in common, one )
    res2 = filter( lambda x: x.split('\t')[0] in common, two )
    count = len( res1 )
    for x in range(count):
        output.write( res1[x] )
        output.write( res2[x] )
    
    11.07.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..