2017-01-30 3 views
0

Моя цель - прочитать в файле и вернуть соответствующую информацию, которую пользователь запросил. Например мой текстовый файл выглядит следующим образом (она представляет собой год и студентов высот от этого года):Чтение в файлах и возвращающих строк в python

5,5 6,3 4,0 5,2 5,1

4,6 4,8 5,3 5,6 6,0

3,8 4,9 6,0 5,8 5,7

В принципе, если я вхожу в 2013 году, я хочу, чтобы он вернул список высот, соответствующих тому году (строка ниже). Но я не могу это сделать, чтобы распечатать список строк. Некоторая помощь будет отличной.

#read in text file 
f = open("students.txt") 
#ask for student year 
year = input("Enter the year for the data you want to receive:") 
#check to see if year is avialble 
line = f.readline() 
while True: 
    line = f.readline().split() 
    if line: 
     if line == year: 
      print(line) 
    else: 
     break 
     print("No data") 

ответ

0

Когда вы делаете f.readline().split(), вы получаете список. Итак, для первой строки у вас будет что-то вроде line == ['2013']. С другой стороны, год - это строка. Поэтому, если пользователь поставил 2013, type(year) == <class 'str'>, а type(line) == <class 'list'>. Поскольку они никогда не равны друг другу, предложение if никогда не True, и линия никогда не печатается.

#read in text file 
f = open("students.txt") 
#ask for student year 
year = input("Enter the year for the data you want to receive:") 
#check to see if year is available 
for line in f.readlines(): 
    if year in line: 
     f.readline() 
     print (f.readline()) 
     break 

Выше кода не будет работать, если есть ученик, чья высота превышает 2000, я полагаю.

0

Вместо этого попробуйте прочитать все записи в словаре. Тогда его просто запросить по годам.

def readentries(f):  
    # read until we get `StopException` i.e. end of file 
    while True: 
     try: 
      # take two lines from the file and strip newlines 
      # and split heights by spaces to give a list of heights 
      yield next(f).strip(), next(f).strip().split() 
     except StopIteration: 
      # break out of the infinite while loop 
      break 

with open('heights.txt') as f: 
    entries = dict(readentries(f)) 

year = input("Enter the year for the data you want to receive: ") 

# query dict for supplied entry 
if year in entries: 
    print('for year %s we have heights %s ' % (year, ', '.join(entries[year]))) 
else: 
    print('no data') 

Вы можете преобразовать высоту в float переменных. Это было бы легко добавить.

0

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

with open('students.txt', 'r') as f: 
    data = [i.strip() for i in f] # strip trailing space 

year = input("Enter year: ") 
try: 
    # find index, get the next line 
    line = data[data.index(year) + 1] 
    # split on whitespace, apply float() 
    item_list = [float(i) for i in line.split()] 
except ValueError: # raised if year not found 
    print("No relevant data") 
0

Печать следующей не пустой строки после строки, равной требуемому году.

year = "2013" 

with open("students.txt") as f: 
    stop = False 
    for line in f: 
     line = line.rstrip("\n") 
     if line == year: 
      stop = True 
     else: 
      if line and stop: 
       print line.split() 
       break 

    if not stop: 
     print "No data for year {}.".format(year) 
0

Вы также можете создать два списка и построить словарь перебором строк THHE файла:

with open("grade.txt", "r") as file: 
    year = [] 
    height = [] 
    for i in file: 
     if len(i.strip("\n")) == 4: 
      year.append(i.strip("\n")) 
     elif i != "\n": 
      height.append(i.strip("\n").split(" ")) 
    ydict = {year[i]: height[i] for i in range(len(year))} 

print(ydict['2013']) 
0

Поскольку данные включают в себя несколько заготовок линий и вкладки, вы хотите, чтобы очистить его сначала. Тогда это просто вопрос добавления четных рядов (лет) в виде ключей (начиная с нуля) в словаре и нечетных строк (высот) в качестве значений в словаре.

year = input("Enter the year for the data you want to receive:") 
with open("students.txt") as f: 
    # read stripped file lines into list keeping only those that contain data 
    data = [line.strip() for line in f.readlines() if line.strip() != ''] 
# build a dict from the data using list slicing to get the years (keys) and heights (values) 
data_dict = dict(zip(data[0::2], data[1::2])) 
# print the heights if the year exists otherwise 'No data.' 
print(data_dict.get(str(year)) if data_dict.get(str(year)) else 'No data.') 
Смежные вопросы