2015-02-13 4 views
1

У меня есть два файла:питона проверить список с другим списком

file A: 
U1 
U2 
U3 
file B: 
U1hjg 444 77 AGT 
U8jha 777 33 AKS 
U2jsj 772 00 AKD 
U55sks 888 02 SJD 
U3jsj 666 32 JSJ 

Тогда у меня есть два списка:

listA=open("file A").readlines() 
listB=open("file B").readlines() 

И я хотел бы проверить для каждого члена lišta, если он присутствует в списке B, и напечатайте два файла: один с файлом B со спичками (упорядочен по списку A), а другой с файлом без совпадений. Желаемый результат:

file list_match: 
U1hjg 444 77 AGT 
U2jsj 772 00 AKD 
U3jsj 666 32 JSJ 

file list_unmatched: 
U8jha 777 33 AKS 

U55sks 888 02 SJD

Я новичок очень, поэтому я начал пытаться это как пример:

print(ListA[1]) 
print(ListB[2]) 

if ListA[1] in ListB[2]: 
    print("yes") 

И выход:

U2 
U2jsj 772 00 AKD 

Но «да» не напечатано

Но если я:

if "U2" in ListB[2]: 
    print("yes") 

Выход:

yes 

Я не понимаю, где ошибка. Может ли кто-нибудь помочь мне?

ответ

2
st = set(list_b) 

matches = ([line for line in list_a if line in st]) 

Чтобы получить как:

# with will close your file automatically 
with open("file A") as f1 ,open("file B") as f2: 
    st = set(f2) # get set of all lines in file b 
    matches = [] 
    diff = [] 
    for line in f1: # iterate over every line in file a 
     if line in st: # if line is in file b add it to our matches 
      matches.append(line) 
     else: # else add it to our diff list 
      diff.append(line) 

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

with open("file A") as f1,open("file B") as f2,open("matches.txt","w") as mat ,open("diff.txt","w") as diff: 
    st = set(f1) 
    for line in f2: 
     if line in st: 
      mat.write(line) 
     else: 
      diff.write(line) 

Вам нужно всего лишь ListA[1].rstrip() in ListB[2] в вашем собственном примере. В конце ListA[1] есть символ новой строки и все строки, исключая последние. Если вы print(repr(ListA[1])), вы точно увидите, что там есть.

Печать наш набор и каждую строку перебираемого вы можете увидеть новые строки в конце:

{'U2\n', 'U3', 'U1\n'} <-st 
# print(repr(line)) on all lines from fileB 
'file B:\n' 
'U1hjg 444 77 AGT\n' 
'U8jha 777 33 AKS\n' 
'U2jsj 772 00 AKD\n' 
'U55sks 888 02 SJD\n' 
'U3jsj 666 32 JSJ' 
1

Это происходит потому, что readlines() дает линию с \n завершающего характера. Поэтому, когда вы делаете

if ListA[1] in ListB[2]: 
    print("yes") 

вы, по сути проверка, если "U2\n" в "U2jsj 772 00 AKD\n", которая возвращает значение False. Но поскольку "U2" действительно присутствует, он печатает "yes", когда вы используете литерал.

Вы можете проверить то же самое в примере программы ниже:

$ cat text.txt 
Sample 
Text 
Here. 
$ cat test.py 
with open("text.txt", "r") as f: 
    text = f.readlines() 
    print text 
    print text[0] 
$ python test.py 
['Sample\n', 'Text\n', 'Here.\n'] 
Sample 

$ #prompt 

Чтобы исправить это, если ваши размеры файла огромны, раздеть линии с помощью ListA[1].rstrip().

Else, вы можете использовать .read() и разделение на "\n", создать список, и использовать метод пользовательского списка понимания:

with open("file A") as f1 ,open("file B") as f2: 
    s1 = f1.read().split("\n") 
    s2 = f2.read().split("\n") 
    with open("matching.txt","w") as match, open("non-matching.txt","w") as no_match: 
     matching = [x for x in s2 for y in s1 if y in x] 
     non_matching = [x for x in s2 for y in s1 if y not in x] 
     for line in matching: 
      match.write(line) 
     for line in non_matching: 
      no_match.write(line) 
Смежные вопросы