Ich habe die folgenden Referenzdaten wie

21   1
32   2
45   3

Und es gibt eine Textdatei (file.txt), die zwei oder mehr Spalten wie enthält

21  32  45
45  21  32
32  45  21

Ich möchte file.txt mit Referenzwert wie ändern

1   2   3
3   1   2
2   3   1

Wie Sie in der Referenzdatei sehen können, sind 21, 32 und 45 gleich und stimmen mit den Nummern 1, 2 und 3 überein.

Ich habe basierend auf zwei for-Schleifen codiert und zwei Werte verglichen.

with open('ref') as f1, open('file.txt') as f2, open('out.txt', 'w') as f3:

     for lines in f1:
         value1 = lines.split()

         for line in f2:
             if value2 == value1[0]:
                value2 = value1[1]
                line = ' '.join(value2) + '\n'
             f3.write(line)

Nichts wurde geändert. Wie könnte dies möglich machen?

0
Chang Woon Jang 22 Nov. 2013 im 00:57

3 Antworten

Beste Antwort
mydict = {}
with open('ref') as f1:
    for line in f1:
        key, value = line.split()
        mydict[key] = value

with open('file.txt') as f2, open('out.txt', 'w') as f3:
    for l in f2:
        line = l.split()
        newline = ''
        for item in line:
            newline += mydict[item] + " "
        f3.write(newline + "\n")
1
Farhadix 21 Nov. 2013 im 21:14

Sie benötigen eine dritte Schleife, um die Spalten von file.txt zu durchlaufen. Etwas wie

for line in f2:
    value2 = line.split()
    for item in value2:
        if item == value1[0]:
            value2 = value1[1]

Ein Diktat scheint gut zu Ihrem Problem zu passen:

#/usr/bin/env python
ref = {}
with open("ref") as file:
    for line in file:
        k, v = line.split()
        ref[k] = v

with open("file.txt") as file, open("res", 'w') as res:
        for line in file:
            for item in line.split():
                res.write("%s\t" % ref[item])
            res.write("\n")
1
damienfrancois 21 Nov. 2013 im 21:18

Sie vergleichen es NICHT richtig

with open('ref') as f1, open('file.txt') as f2, open('out.txt', 'w') as f3:

 for lines in f1:
     value1 = lines.split()

     for line in f2:
         value2 = line.split() # value2 is a list
         if value2 == value1[0]: # if a list is equals to a value => always false
            value2 = value1[1]
            line = ' '.join(value2) + '\n'
         f3.write(line) # so line is still the original line since the if statement is always false
1
JoeC 21 Nov. 2013 im 21:06