2013-09-07 3 views
0

Как связать город, время, местный с одним поиском. Например, если у меня есть функция, которая называется search, она будет искать весь список только для city2 и печатать только значения City2, Time2, Local2? Нужно ли что-нибудь делать, когда я читаю файл и помещаю его в список?Python - список из файла

* UPDATE * Есть в любом случае, чтобы переписать этот код таким образом, что у вас есть 3 атрибутов (город, время, местные) и сохраните данные из файла на объекты в списке? И использовать функцию str для их печати?

Пример списка

City 
Time 
Local 
-------------- 
City2 
Time2 
Local2 
-------------- 
City 
Time 
Local 
-------------- 
City3 
Time3 
Local3 
-------------- 

Код:

class gym: 
def __init__(self, city, local, time, ): 
    self.city = city 
    self.local = local 
    self.time = time 
    self.city_dict = {} 

    def readfile(): 
     row = "start" 
     list = [] 
     infile = open("data.txt", "r", encoding="utf-8") 
     while row != "": 
      row = infile.readline() 
      list.append(rad) 
     infile.close() 

gym.readfile() 

ответ

1

Blckknght дал вам хорошее решение, которое будет очень полезно, если вы хотите, чтобы делать другие вещи, с данными, но для выполнения этой задачи вы описываете - найти «City2» и распечатать его, вместе со своим временем и местные, - вы могли бы сделать это с помощью простого grep -A2 City2 data.txt или с Python:

with open("data.txt", encoding="utf-8") as fh: 
    for line in fh: 
     if line.startswith("City2"): 
      for _ in range(3): 
       print(line.strip()) 
       line = next(fh) 
      continue 

Если вы хотите, чтобы найти только первое вхождение вы можете заменить continue с break.

Как указано в комментариях, вам не нужно печатать результаты немедленно. Вы можете сделать это:

matches = [] 
with open("data.txt") as fh: 
    for line in fh: 
     if line.startswith("City2"): 
      matches.append([]) 
      for _ in range(3): 
       matches[-1].append(line.strip()) 
       line = next(fh) 
      continue 
for match in matches: 
    print("City: {}; Time: {}; Local: {}".format(*match)) 
+0

Попробуем, спасибо – Amidii

+0

Да, я получаю ошибки на python 3 .. hehe – Amidii

+0

@ user73379, вы можете просто заменить операторы 'print' на' print (line.strip()) 'и передать кодировку' open ', как и в вашем коде. –

3

Я думаю, что самым простым решением было бы сразу прочитать весь файл и разделить различные части на различных разделителей. Чтобы сделать ваш поиск, вы хотите создать сопоставление словаря из city значений другим.

from collections import defaultdict 

class gym(): 
    def __init__(self): 
     self.city_dict = defaultdict(list) 

    def readfile(self): 
     with open("data.txt", encoding="utf-8") as infile: 
      text = infile.read() # consumes the whole file into a string 

     text = text.rstrip('-\n') # strip off any trailing dashes or newlines 

     # split twice, first on dashed lines, then on newline characters 
     data = [g.strip().split('\n') for g in text.split('--------------')] 

     # now, store in dictionary for searching 
     for city, time, local in data: 
      self.city_dict[city].append((city, time, local)) 

    def search(self, city): 
     for group in self.city_dict[city]: 
      print(*group) 
+0

+1. Но вы должны проверить длину каждого вектора в списке, потому что он будет иметь дополнительный элемент «». В противном случае вы получите эту ошибку: 'ValueError: слишком много значений для распаковки (ожидается 3)' –

+0

Есть ли какой-либо параметр, отсутствующий в файле чтения? И можете ли вы объяснить def search .. является ли «город» переменной? – Amidii

+0

@MortenKristensen Хорошая мысль, немного сложно заставить ее работать с грязными данными. Затянутая линия тире особенно проблематична. Я отредактирую с исправлением большинства ошибок, о которых я могу думать. – Blckknght

Смежные вопросы