2017-01-28 19 views
0

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

John 2543 
Jack 2453 
Henry 3672 
Jane 2405 
Terry 9863 

И мой код, как это:

def function(): 

    file = open('file.txt')  

    for lines in file: 
     name, number = lines.split(' ') 
     return name 

def main(): 
    print(function()) 

main() 

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

EDIT:

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

John 
Jack 
Henry 
Jane 
Terry 
2543 
2453 
3672 
2405 
9863 

, когда я хочу, чтобы они появлялись как:

John 2543 
Jack 2453 
Henry 3672 
Jane 2405 
Terry 9863 

ответ

0

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

содержимое файла затем обрабатывается в цикле for.

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

def function(): 

    with open('file.txt') as file: 

     for line in file: 
      name, value = line.split() 
      value = int(value) 
      yield name, value 

# here you can do what you need to for all the data in the file 
for name, value in function(): 
    print(name, value) 

я взял на себя смелость бросить value к int. не знаю, если это полезно для вас ...

, если вам нужно изменить строку/столбец, то вы должны прочитать все в памяти, и вы могли бы к этому:

data = [(names, values) for names, values in function()] 
names = [item[0] for item in data] 
values = [item[1] for item in data] 

вы могли бы тогда довольно -print, который:

separator = '|' 
name_lst = ['{:6s}'.format(name) for name in names] 
value_lst = ['{:<6d}'.format(value) for value in values] 

# join the lists to str 
print(separator.join(name_lst)) 
print(separator.join(value_lst)) 

# John |Jack |Henry |Jane |Terry 
# 2543 |2453 |3672 |2405 |9863 
+0

Привет, что, если мне пришлось возвращать другой столбец через отдельную функцию? – DrMoe

+0

@DrMoe Вы имеете в виду тот, который я называю 'value'? вы можете использовать ту же самую функцию и просто «значение yield». –

+0

Но если я сделаю это, второй список не будет напечатан после другого? Что делать, если вы хотите распечатать их рядом? – DrMoe

0

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

Сначала необходимо построить весь список, а затем верните его.

def function(): 
    with open('file.txt') as file: 
     names = [] 
     for line in file: 
      names.append(line.split()[0]) 

    return names 

или

def function(): 
    with open('file.txt') as file: 
     return [line.split()[0] for line in file] 

и использовать его как это:

def main(): 
    for name in function(): 
     print(name) 
+0

Я вижу. Итак, чтобы передать ее через основную функцию, которую мне пришлось бы перебирать по списку, чтобы напечатать ее в формате столбца, правильно? – DrMoe

+0

Что делать, если бы я хотел сделать это для обеих колонок, и держать их обоих в одной строке? Если я сделаю это так, как показано выше, не будет ли второй столбец первым после первого? Это, если предположим, гипотетически, что мне пришлось использовать вторую функцию для возврата второго столбца – DrMoe

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

  • Нет связанных вопросов^_^