2016-12-02 4 views
1

Как конденсироваться, т.е. устранить избыточность из следующих данных:устранить избыточность из файла с помощью Python

code: GB-ENG, jobs: 2673 
code: GB-ENG, jobs: 23 
code: GB-ENG, jobs: 459 
code: GB-ENG, jobs: 346 
code: RO-B, jobs: 9 
code: DE-NW, jobs: 4 
code: DE-BW, jobs: 3 
code: DE-BY, jobs: 9 
code: DE-HH, jobs: 34 
code: DE-BY, jobs: 11 
code: BE-BRU, jobs: 27 
code: GB-ENG, jobs: 20 

Вывод должен быть таким образом:

GB-ENG, 3521 
RO-B, 9 
DE-NW, 4 
DE-BW, 3 
DE-HH, 34 
DE-BY, 20 
BE-BRU, 27 

Описан 1 каноническим представлением от каждого кода, то есть DE-BY, который будет представлять суммарную совокупность по числам, которые связаны с каждым экземпляром этого кода, например:

code: DE-BY, jobs: 11 
code: DE-BY, jobs: 9 

становится

DE-BY, 20 

на данный момент я создаю этот вход с помощью этого скрипта Python:

import json 
import requests 
from collections import defaultdict 
from pprint import pprint 

def hasNumbers(inputString): 
    return any(char.isdigit() for char in inputString) 

# open up the output of 'data-processing.py' 
with open('job-numbers-by-location.txt') as data_file: 

    # print the output to a file 
    with open('phase_ii_output.txt', 'w') as output_file_: 
     for line in data_file: 
      identifier, name, coords, number_of_jobs = line.split("|") 
      coords = coords[1:-1] 
      lat, lng = coords.split(",") 
      # print("lat: " + lat, "lng: " + lng) 
      response = requests.get("http://api.geonames.org/countrySubdivisionJSON?lat="+lat+"&lng="+lng+"&username=s.matthew.english").json() 


      codes = response.get('codes', []) 
      for code in codes: 
       if code.get('type') == 'ISO3166-2': 
        country_code = '{}-{}'.format(response.get('countryCode', 'UNKNOWN'), code.get('code', 'UNKNOWN')) 
        if not hasNumbers(country_code): 
         # print("code: " + country_code + ", jobs: " + number_of_jobs) 
         output_file_.write("code: " + country_code + ", jobs: " + number_of_jobs) 
    output_file_.close() 

это, вероятно, будет наиболее эффективным, чтобы включить эту функцию в рамках этого сценария, но я пока не удалось выяснить, как это сделать.

+1

Вы можете попробовать использовать питона счетчик где ключ код и значение является числом рабочих мест. – Steve

+0

вместо того, чтобы писать в файл, который вы имеете в виду? как это будет выглядеть? –

+0

Возможно, вы легко справитесь с использованием только стандартных инструментов UNIX и командной строки. – Tobias

ответ

1

предполагая текст хранится в текстовом файле, это будет работать

infile = open('redundancy.txt','r') 
a= infile.readlines() 
print a 
d={} 
for item in a: 
    c=item.strip('\n')  
    b=c.split()  
    if b[1] in d : 
     d[b[1]]= int(d.get(b[1]))+eval((b[3])) 
    else: 
     d[b[1]]=b[3] 
print d 

это дало бы результат:

{'DE-BY,': 20, 'DE-HH,': '34', 'DE-BW,': '3', 'DE-NW,': '4', 'RO-B,': '9', 'GB-ENG,': 3521, 'BE-BRU,': '27'} 
1

В приведенном ниже коде используется метод dict.get(), который вы используете во всем своем текущем коде для реализации счетчика. Это основано на чтении значений из текущего файла .txt, но вы можете просто обойти запись в файл и последующее чтение с использованием аналогичного метода.

tally = {} 

with open('country_codes.txt', 'r') as infile, open('condensed.txt', 'w') as outfile: 
    for line in infile: 
     data = line.strip('\n') 
     tag1, code, tag2, num = data.split() 
     tally[code] = tally.get(code, 0) + int(num) 
    for key, value in tally.items(): # Use .iteritems() for Python 2.x 
     outfile.write(' '.join(map(str, [key, value, '\n']))) 

Это займет файл (country_codes.txt) с этой структурой:

code: GB-ENG, jobs: 2673 
code: GB-ENG, jobs: 23 
code: GB-ENG, jobs: 459 
code: GB-ENG, jobs: 346 
code: RO-B, jobs: 9 
code: DE-NW, jobs: 4 
code: DE-BW, jobs: 3 
code: DE-BY, jobs: 9 
code: DE-HH, jobs: 34 
code: DE-BY, jobs: 11 
code: BE-BRU, jobs: 27 
code: GB-ENG, jobs: 20 

И написать это condensed.txt следующим образом:

DE-BY, 20 
DE-HH, 34 
DE-BW, 3 
DE-NW, 4 
RO-B, 9 
GB-ENG, 3521 
BE-BRU, 27 
+0

так что тогда это собственный файл? –

+0

Я не уверен, что вы просите. В настоящее время я думаю, что вы записываете неконденсированный вывод в 'phase_ii_output.txt'? Основываясь на этом подходе, вам нужно будет снова прочитать данные (как я здесь сделал) и обработать его снова, чтобы получить желаемый результат. Но просто не удастся полностью удалить запись в 'phase_ii_output.txt'. Идея состоит в том, чтобы просто использовать 'tally [code] = tally.get (code, 0) + int (num)' для подведения итогов заданий – roganjosh

+0

. Это говорит, что 'dict' не имеет атрибута 'iterItems' –

1

Вы могли бы сделать что-то подобное:

data = """code: GB-ENG, jobs: 2673 
code: GB-ENG, jobs: 23 
code: GB-ENG, jobs: 459 
code: GB-ENG, jobs: 346 
code: RO-B, jobs: 9 
code: DE-NW, jobs: 4 
code: DE-BW, jobs: 3 
code: DE-BY, jobs: 9 
code: DE-HH, jobs: 34 
code: DE-BY, jobs: 11 
code: BE-BRU, jobs: 27 
code: GB-ENG, jobs: 20""" 


final_data = {} 

for code, count in [_.strip('code: ').split(', jobs: ') for _ in data.split('\n')]: 
    if code in final_data: 
     final_data[code]['amount'] += int(count) 

    else: 
     final_data[code] = {'amount': int(count)} 

for key, value in final_data.items(): 
    print('code: {}, jobs: {}'.format(key, value['amount'])) 
1
import sys, re 
from collections import defaultdict 
tally = defaultdict(int) 
for line in sys.stdin: 
    match = re.match(r'^code: (?P<code>\S+), jobs: (?P<jobs>\d+)', line).groupdict() 
    tally[match["code"]] += int(match["jobs"]) 
for code, jobs in tally.iteritems(): 
    print "{}, {}".format(code, jobs) 
1

Это предположить, что у вас есть countries.txt отформатирован как

code: GB-ENG jobs: 2673 
code: GB-ENG jobs: 23 
code: GB-ENG jobs: 459 
code: GB-ENG jobs: 346 
code: RO-B jobs: 9 
code: DE-NW jobs: 4 
code: DE-BW jobs: 3 
code: DE-BY jobs: 9 
code: DE-HH jobs: 34 
code: DE-BY jobs: 11 
code: BE-BRU jobs: 27 
code: GB-ENG jobs: 20 

фрагмент кода

with open('countries.txt') as input_file, open('phase_ii_output.txt', 'w') as output_file: 
      args = [] 
      dic = {} 
      for line in input_file: 
       args.append(line.split(" ")) 
      for n in args: 
       key = n[1] 
       num = int(n[3].rstrip()) 
       if key in dic: 
        dic[key] += num 
       else: 
        dic[key] = num 
      output_file.write(dic) 

выход

{'BE-BRU': 27, 'DE-BY': 20, 'DE-NW': 4, 'DE-BW': 3, 'RO-B': 9, 'GB-ENG': 3521, 'DE-HH': 34}