Mam 2 pliki TXT, jeden jest lista owoców, druga jest listą wielu danych z owocami osadzonym w każdej linii w następujący sposób:

Plik 1:

apple
orange
grape
banana
pear

Plik 2

Brian b7890 apple orchard autumn
Sue c7623 grape vineyard summer
Richard z4501 grapefruit citrusGrove autumn
Mary m8123 pear orchard autumn

Muszę wyodrębnić linie z pliku 2, gdzie jego odpowiednie owoce nie pojawiają się w pliku 1 i napisz go do nowego pliku tekstowego. Jedyna linia w tym przykładzie pliku 2, która spełniałaby kryteria:

Richard z4501 grapefruit citrusGrove autumn

Uwaga: Biorąc pod uwagę ten przykład, ponieważ słowo "winogrono", który pojawia się w pliku 1, jest częścią słownego grejpfruta, który wyklucza niektóre z bardziej prostych metod ekstrakcji.

Zacząłem od umieszczania każdej linii każdego pliku w listach:

f = open('ListOfFruits.txt')
listOfFruits = [line.strip() for line in open('ListOfFruits.txt')]
f.close()

a = open('AllFruitData.txt')
AllFruitData = [line.strip() for line in open('AllFruitData.txt')]
a.close()

i=0
x=0

while x < len(listOfFruits):
    if listOfFruits[i] not in allFruitData[x]:
        i=i+1
        #then check against allFruitData again
        #continue until the end of listOfFruits
        #if no match is found then add the line allFruitData[x] to a new txt file
   x=x+1  

Próbowałem różnych metod korzystających z pętli, podczas gdy pętle i wyciągi, ale zawsze wydają się utknąć z składni. Próbuję sobie wyobrazić kod pracujący jako 2 koła wirujące się względem siebie, podczas gdy 1 jest stacjonarny, drugi obraca się przez całą drogę aż do znalezienia meczu. Jeśli zostanie znaleziony mecz, koło stacjonarne poruszałoby się na 1 pozycję, a ruchome koło zresetowano. Jeśli stacjonarne koło nie znaleziono dopasowania na ruchomym koła, a ten kawałek danych trafiłby do nowego koszyka. Byłoby to kontynuowane, aż wszystkie pozycje na kanale stacjonarnym zostaną przemierzone przez ruchome koło.

0
user3062260 3 grudzień 2013, 20:55

2 odpowiedzi

Najlepsza odpowiedź

Co z użyciem set s. Następnie możesz użyć Zestaw różnic. Proste wdrożenie może być (jeśli owoc jest zawsze w trzecim miejscu w każdej linii drugiego pliku)

with open('listOfFruits.txt', 'r') as f:
    fruits = set([line.rstrip() for line in f])
with open('allFruitData.txt', 'r') as f:
    data = {}
    for line in f:
        fruit = line.rstrip().split()[2]
        data[fruit] = line

fruits_not_in_file = set(data.keys()) - fruits
with open(outfile, 'w') as f:
    for fruit in fruits_not_in_lile:
        f.write(data[fruit])

Edytuj:

W przypadku, gdy owoce mogą pojawić się w dowolnej kolumnie, ten problem jest znacznie trudniejszy, jeśli nie wiesz, które słowa są owocami. Jednakże, jeśli chcesz wydrukować linie, które nie zawierają żadnej z nazwanych owoców, to nie jest zbyt złe:

with open('listOfFruits.txt', 'r') as f:
    fruits = set([line.rstrip() for line in f])

with open('outfile.txt', 'w') as outf, open('allFruitData.txt', 'r') as inf:
    for line in inf:
        words = set(line.rstrip().split())
        # you can replace this `if` with `if fruits & words == set()`
        if not fruits & words:
            outf.write(line)

Co to jest najpierw czytane we wszystkich owocach jako zestaw. Następnie, dla każdego wiersza w pliku danych testujemy, jeśli którykolwiek ze słów w tej linii znajdują się w zestawie owoców. Jeśli przecięcie jest puste, a następnie wydrukuj ten linię do wypustu. Jeśli linia zawiera gdzieś owoc, a następnie przejdź do następnej linii.

Należy zauważyć, że nie będzie to zgodne 'grape' za pomocą 'grapefruit', ponieważ dzieli się linię na podstawie dowolnego przycisku wybranego (wygląda jak przestrzeń lub \t).

0
wflynny 4 grudzień 2013, 00:05

Należy to wykonać zadanie (zakładając, że owoce w pliku2 są zawsze trzecim przedmiotem):

def compare_fruits():

    files = ["file1", "file2"]
    file_list = []

    for file in files:
        with open("filepath/%s.txt", % file "r") as f:
            file_list.append(f.readlines())

    list1 = [i.strip() for i in file_list[0]]
    list2 = [i.split()[2] for i in file_list[1]]

    diff = []

    for i in list1:
        for j in list2:
            if j not in i:
                diff.append(j)

    with open("filepath/file3.txt", "w") as f: #creates file3 if doesn't exist
        for i in diff:
            f.write(i + '\n')
0
Totem 3 grudzień 2013, 17:25