2017-02-13 30 views
0

OK, Это, наверное, довольно просто, но я все еще очень новичок в python. Я ценю помощь.Python: как искать текстовый файл для строки, затем получить доступ к тому, что написано после него

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

Например:

2010 
11 21.5 18 15.2 13 17 14 0 10 16 8.6 5 
2013 
10.6 14.5 17.9 11.2 1.5 1.9 16 2.2 10 5.2 4.6 5 

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

Кажется, я не могу заставить это работать.

В настоящее время программа проверяет год, и если он не найден, он скажет так и снова спросит, но если он будет найден, он сразу же попросит снова.

Это прибрано версия часть моего кода:

f = open(sys.argv[1]) 

months = ['January', 'February', ...] 

while True: 
    f.seek(0) 
    os.system('cls') 
    year = input("Enter year for which you want rainfall data: ") 
    line = f.readline().strip() 
    while line and line != year: 
     line = f.readline().strip() 

    if not line: 
     print("No rainfall data found for year {}".format(year)) 
     input("Press Enter to continue ...") 
     response = input("Do it again for another year? [[y]/n] ") 
     if response == "n": 
      break 

    else: 
     rain_line = f.readline() 
     rain_line = rain_line.strip() 
     rain_line = rain_line.split() 
     rain_strings = list(rain_line) 
     rain_numbers = [] 
     for rain in rain_strings: 
      rain_numbers.append(rain) 

    print("in {}, {} Millimeters.".format(months[1], rain_numbers[1])) 

Любой увидеть, если я близко или далеко?

Я много часов ходил вокруг.

ответ

0

Не считайте это одной строкой и следующей строкой, рассматривайте их как пары. С помощью этого pairwise iterator:

def parse_rainfall(f): 
    for year, data in pairwise(f): 
     # ... 
0

Для вашего кода, проблема заключается в условии выражения в то время как while line and line != year:.

Если вход как 2010 для year = input("Enter year for which you want rainfall data: "), он будет разобран для int типа, и никогда не будет равна line, который является строкой. Использовать конверсию str(year) устранит проблему.

Но вы можете использовать другой метод как для эффективности, так и для кодирования.

Если файл не очень большой, попробуйте сначала проанализировать файл, превратив его в словарь Python, например {2010: [11 21.5 18 15.2 13 17 14 0 10 16 8.6 5], ...}, после чего вы можете просто запросить словарь, используя год в качестве ключа и получить его данные.

Если файл большой, попробуйте разобрать его и записать в базу данных, SQL или NoSQL, тогда запрос станет таким же простым, как и с использованием словаря Python.

0

В противном случае вы можете изменить способ поиска в текстовом файле и использовать такое решение (я не тестировал его с большим файлом. Пожалуйста, дайте мне знать, если он сломается с ним).

Я предполагаю, что входной файл называется input_file:

def get_data(): 
    data = list(k.rstrip() for k in open("input_file", 'r')) 
    d = list(data[k:k+2] for k in range(0,len(data),2)) 
    final = [] 
    while True: 
     user_data = input("Enter a year: ") 
     if user_data == 'q': 
      break 
     for k in d: 
      if k[0] == user_data: 
       final.append(k[1]) 

     if final != '': 
      print("\n".join(final)) 
      final = [] 
     else: 
      print("Cannot find any data for the year:", user_data) 


get_data() 

Демо:

Enter a year: 2010 
11 21.5 18 15.2 13 17 14 0 10 16 8.6 5 
Enter a year: 2013 
10.6 14.5 17.9 11.2 1.5 1.9 16 2.2 10 5.2 4.6 5 
Enter a year: 2000 
Cannot find any data for the year: 2000 
Enter a year: 2010 
11 21.5 18 15.2 13 17 14 0 10 16 8.6 5 
Enter a year: 2100 
Cannot find any data for the year: 2100 
Enter a year: 22 
Cannot find any data for the year: 22 
Enter a year: q