2016-04-20 106 views
3

我有以下格式文件:解析文件在Python

Berlin, Germany 
New Delhi , India 
New York , USA 
Mumbai , India 
Seattle, USA 

我需要解析文件和打印輸出作爲

Germany : Berlin 
India: New Delhi , Mumbai 
USA: New York, Seattle 

我寫了代碼:

enter code here: 

def check(): 
    datafile=open('logfile.py','rU') 
    found=False 
    for line in datafile: 
     if 'India' in line: 
      lines=line.split() 
      print("India"+":"+lines[0]) 
     if 'Germany' in line: 
      lines=line.split() 
      print("Germany"+":"+lines[0]) 
     if 'USA' in line: 
      lines=line.split() 
      print("USA"+":"+lines[0]) 
    datafile.close() 
check() 

此代碼輸出爲:

Germany:Berlin 
India:NewDelhi 
USA:NewYork 
India:Mumbai 
USA:Seattle 

請幫忙。

+1

你是如何做一個默認的'分裂()'和失去逗號? – TigerhawkT3

+0

基本上,正如你在第一個答案中看到的那樣,你必須爲所有國家制作清單。所以訣竅在於開始一個國家名單,然後決定一個國家是否已經存在,然後將該城市附加到國家名單。 – roadrunner66

+0

@ roadrunner66 - 'collections.defaultdict'爲你管理所有這些 – PaulMcG

回答

4

另一種方法,是使用defaultdictcollections來實現這一目標:

from collections import defaultdict 

def check(): 
    d = defaultdict(list) 
    with open('logfile.py', 'rU') as datafile: 
     for line in datafile: 
      data = line.split(',') 
      d[data[1].strip()].append(data[0].strip()) 
    return d 
res = check() 

for k, v in res.items(): 
    print("{} : {}".format(k, ', '.join(v))) 

輸出:

India : New Delhi, Mumbai 
Germany : Berlin 
USA : New York, Seattle 
+0

不錯 - 現在它讓我想知道如何在原始的'required'列表中獲得那種非理性的間距。 – usr2564301

2

不是直接打印所有內容,而是將其保存爲數據結構,如字典或collections.defaultdict

import collections.defaultdict as dd 
result = dd(list) 
with open('logfile.py', 'rU') as datafile: 
    for line in datafile: 
     city,country = map(str.strip, line.strip().split(',')) 
     result[country].append(city) 

然後打印結果:

for country in result: 
    print(country+':', ', '.join(result[country])) 

如果你覺得有可能是重複的國家/城市列表,你不希望他們使用setadd代替listappend