मेरे पास निम्न प्रारूप के साथ एक 'शब्दकोश' टेक्स्ट फ़ाइल है:

1 CH a
2 H1 a
3 H2 a
4 H3 b
5 CO b
6 HA b
...

मेरे पास एक इनपुट फ़ाइल है जो इस तरह दिखती है:

D1 2 1 3 4  78.5
D2 2 3 4 5 100.2
D3 2 1 5 6  35.2
...

मैं जिस आउटपुट को प्राप्त करने का प्रयास कर रहा हूं वह यह है:

a H1 a CH a H2 b H3  78.5
a H1 a H2 b H3 b CO 100.2
a H1 a CH b CO b HA  35.2

मैं डिक्शनरी फ़ाइल को कॉलम में विभाजित करने का प्रयास कर रहा हूं जो पहले कॉलम को कुंजी के रूप में और दूसरे और तीसरे कॉलम को मान के रूप में निर्दिष्ट करता है। फिर मैं कॉलम द्वारा इनपुट फ़ाइल पढ़ता हूं और पहले से जेनरेट की गई कुंजियों के साथ कॉलम [1:4] में संख्या का मिलान करता हूं और संबंधित मानों को प्रिंट करता हूं। इनपुट फ़ाइल में अंतिम कॉलम के लिए मैंने पहचानकर्ता से मेल खाने वाली एक और कुंजी/मान जोड़ी बनाई है, उदाहरण के लिए key=4, value=78.5

file = open("dictionary.txt", "r")
one_dict = dict()
two_dict = dict()
for line in file:
  fields = line.split(" ")
number = fields[0]
name = fields[1]
letter = fields[2]
one_dict[int(number)] = [letter, name]

with open('input.txt') as infile:
  for line in infile:
  fields = line.split("\t")
value = fields[6]
col_4 = fields[4]
two_dict[int(col_4)] = [value]
for x in fields[1: 3]:
    if x in one_dict:
        output[x] = one_dict[x]
    for col_4 in fields:
        if x in one_dict:
           col_4 = one_dict[x[value]]
           print(output[x], output4[x], two_dict[col_4])

मेरी स्क्रिप्ट जैसा है कुछ भी वापस नहीं करता है और मुझे यकीन नहीं है कि क्यों।

3
EA00 25 अक्टूबर 2017, 21:27
यह pandas के साथ लगभग मामूली होगा, लेकिन केवल csv... के साथ करने योग्य होना चाहिए।
 – 
juanpa.arrivillaga
25 अक्टूबर 2017, 21:28
आप इस कोड में आउटपुट को कभी भी परिभाषित नहीं करते हैं, मुझे लगता है कि इसे कहीं और परिभाषित किया गया है। क्या आप एक और पूर्ण कोड उदाहरण पोस्ट कर सकते हैं?
 – 
Sam Bobel
25 अक्टूबर 2017, 21:31
ऐसा लगता है कि आपके पास कुछ इंडेंटेशन समस्याएं हैं। उदाहरण के लिए, field को संदर्भित करने वाले आपके लूप के लिए लूप के मुख्य भाग के बाहर प्रतीत होते हैं। क्या आप अपने कोड स्निपेट को सही इंडेंटेशन के लिए पुन: स्वरूपित कर सकते हैं?
 – 
JeremyKun
25 अक्टूबर 2017, 21:32

1 उत्तर

सबसे बढ़िया उत्तर

आप इसे ओवर-इंजीनियरिंग कर रहे हैं। बस एक मैपर बनाएं, यानी एक डिक्शनरी, और फिर बीच के कॉलम पर मैप करें। तो, नकली इनपुट डेटा का उपयोग करना:

In [34]: s1 = """1 CH a
    ...: 2 H1 a
    ...: 3 H2 a
    ...: 4 H3 b
    ...: 5 CO b
    ...: 6 HA b"""

In [35]: s2 = """D1 2 1 3 4  78.5
    ...: D2 2 3 4 5 100.2
    ...: D3 2 1 5 6  35.2"""

In [36]: import io

तो, मैपर बनाएं:

In [37]: with io.StringIO(s1) as f: # pretend string is a file
    ...:     mapper = {}
    ...:     for line in f:
    ...:         key, _ , value = line.partition(' ')
    ...:         mapper[key] = value.strip()
    ...:

In [38]: mapper
Out[38]: {'1': 'CH a', '2': 'H1 a', '3': 'H2 a', '4': 'H3 b', '5': 'CO b', '6': 'HA b'}

फिर, कुछ जल्दी और गंदा:

In [40]: buffer = io.StringIO() # fake output file
    ...: with io.StringIO(s2) as infile, buffer as outfile:
    ...:     for line in infile:
    ...:         _, *data, last = line.split()
    ...:         outfile.write(' '.join(map(mapper.get, data)))
    ...:         outfile.write(" " + last + "\n")
    ...:     result = buffer.getvalue() # get the value before we "close" the fake file
    ...:
    ...:

In [41]: print(result)
H1 a CH a H2 a H3 b 78.5
H1 a H2 a H3 b CO b 100.2
H1 a CH a CO b HA b 35.2
1
juanpa.arrivillaga 25 अक्टूबर 2017, 21:46