2015-02-16 2 views
0

У меня есть два файла: один - это пользовательский ввод f1, а другой - база данных. F2.I хочу выполнить поиск, если строки из f1 находятся в базе данных (f2). Если не печатать те, которые не существуют, если f2. У меня есть проблемы с моим кодом, не работает нормально: Вот f1:python, сравнить два файла и получить разницу

rbs003491 
rbs003499 
rbs003531 
rbs003539 
rbs111111 

Здесь f2:

AHPTUR13,rbs003411 
AHPTUR13,rbs003419 
AHPTUR13,rbs003451 
AHPTUR13,rbs003459 
AHPTUR13,rbs003469 
AHPTUR13,rbs003471 
AHPTUR13,rbs003479 
AHPTUR13,rbs003491 
AHPTUR13,rbs003499 
AHPTUR13,rbs003531 
AHPTUR13,rbs003539 
AHPTUR13,rbs003541 
AHPTUR13,rbs003549 
AHPTUR13,rbs003581 

В этом случае было бы вернуть rbs11111, потому что это не в f2 , Кодекс:

with open(c,'r') as f1: 
      s1 = set(x.strip() for x in f1) 
      print s1 
      with open("/tmp/ARNE/blt",'r') as f2: 
        for line in f2: 
         if line not in s1: 
          print line 
+0

Вы всегда можете подавать данные из каждого файла в строку и использовать [difflib] (http://pymotw.com/2/difflib/), который является встроенным модулем. Если ваша «база данных» - это база данных sqlite или mysql, то это, вероятно, не сработает, но я предполагаю, что когда вы говорите базу данных, вы просто имеете в виду файл, содержащий данные. Дайте мне знать, если это предположение неверно. – DuckPuncher

ответ

1

Если вы заботитесь только о второй части каждой строки (rbs003411 из AHPTUR13,rbs003411):

with open(user_input_path) as f1, open('/tmp/ARNE/blt') as f2: 
    not_found = set(f1.read().split()) 
    for line in f2: 
     _, found = line.strip().split(',') 
     not_found.discard(found) # remove found word 
    print not_found 
    # for x in not_found: 
    #  print x 
+0

он не работает, он печатает всю базу данных f2, а не только rbs11111, которая не находится в f2. – user3319356

+0

@ user3319356, Он печатает именно то, что вы хотите. См. Демонстрационный прогон: http://asciinema.org/a/16511 – falsetru

+0

ok, мы можем напечатать только rbs11111, вместо 'set ([' rb111111 ']) ?, rstrip() он не работает. – user3319356

0

Ваш line переменная для цикла будет содержать что-то вроде «AHPTUR13, rbs003411», но вы заинтересованы только во второй части. Вы должны сделать что-то вроде:

for line in f2: 
    line = line.strip().split(",")[1] 
    if line not in s1: 
     print line 
0

вам нужно проверить последнюю часть ваших линий, не все из них, вы можете разделить свои строки из f2 с , затем выберите последнюю часть (x.strip().split(',')[-1]), Кроме того, если вы хотите искать, если строки из f1 в базе данных (f2) Ваша логика здесь не так что вам нужно создать свой набор из f2:

with open(c,'r') as f1,open("/tmp/ARNE/blt",'r') as f2: 

        s1 = set(x.strip().split(',')[-1] for x in f2) 
        print s1 
        for line in f1: 
         if line.strip() not in s1: 
          print line 
Смежные вопросы