2015-02-18 2 views
2

У меня есть файл со списком кортежей, как это:Как я могу перебирать кортежи в этом коде python?

(1, 4)

(569, 39)

(49, 69)

. . .

У меня есть этот КОД, но прочитайте все строки за одно и то же время, я хочу читать только одну строку, например строку 1, и иметь значения x, y для их установки в функции, затем возвращать строку 2 и возьмите значения x, y и сделайте это снова и остановитесь, когда длина моего файла будет выполнена.

Что я могу изменить в коде для возврата следующей строки?

import ast 

def readfile(): 
    filename = open('file.log') 
    result=[] 


    with open('file.log', 'r') as f: 
      lst = [ast.literal_eval(line) for line in f.readlines()] 

    for t in lst: 
      x, y = t 
      for t in [(x,y) for x in t[0:] for y in t[:1]]: 
       print x, y 
       value = (x, y) 

       result.append(value) 

    return result[1:-1] 

print readfile() 
+0

Это ваш фактический код? Я ожидал бы 'result.append()' для краха с 'TypeError: append() принимает ровно один аргумент (0 задан)'. – Kevin

+0

Какова ваша конечная цель, или вы делаете это, чтобы попробовать? f.readline() корректно считывает одну строку файла. –

+0

Я обновляю файл. Спасибо – Hdez

ответ

1

Вот решение, что буферы файловой построчное линии. Буферизация экономит память; полезно, если файл огромен.

Я адаптированный сценарий к:

  1. чтения строки построчно
  2. печать одна линия вперед (вы можете удалить эту функциональность, если вы хотите),
  3. отпала необходимость импорта ast:

Выход

enter image description here

Код

####################### 
# define the function # 
####################### 

def readfile(): 

    """ Reads a file consisting of a list of tuples (x, y) line-by-line. Prints x and y of the current line and the next line as reading ensues. """ 

    file_in = open("./tuples.txt","r") # read the file in, I assume the script is run in the same directory as the tuples list 

    result = [] 

    while True: 

     line  = file_in.readline() # read the file line-by-line 
     go_back = file_in.tell()  # "saves" the current line so we can step back 
     next_line = file_in.readline() # reads the line ahead 

     x,y = str(line).replace("(","").replace(")","").replace(" ","").rstrip().lstrip().split(",") 

     # Have we reached the end of the file? 
     try: 
      # No... 
      x_next, y_next = str(next_line).replace("(","").replace(")","").replace(" ","").rstrip().lstrip().split(",") 
      result.append([float(x),float(y)]) 
      print "current line: "+str(x)+" "+str(y)+" ..next line: "+str(x_next)+" "+str(y_next) 

     except ValueError: 
      # Yes... 
      print "current line: "+str(x)+" "+str(y)+" ..next line: "+"NaN NaN" 
      break # break once we read a "next line" that does not exist, i.e. number of lines in file + 1 

     line = file_in.seek(go_back) # go back to previous line 

    return result 

#################### 
# run the function # 
#################### 

result = readfile() 

print "\nresult: "+str(result) 
0

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

for x, y in lst: 
    print x, y 
+0

Спасибо, эта опция печатает все кортежи без(), пример кортежа (1,1) строки 1, см. Здесь 1 1. он строгий, но напечатайте все кортежи файла, поэтому ... Мне нужно просто распечатать одну строку, чтобы использовать эти значения в функции, а затем, когда функция будет выполнена, вернитесь к строке 2 и повторите ее. Можете ли вы дать мне немного шпоры? пожалуйста – Hdez

0

Ваша переменная lst является массивом, так что если вы хотите линии, который вы можете просто вернуть LST [0].

Итак, трюк заключается в том, чтобы хранить lst и написать функцию, чтобы вернуть lst [line-1]. Что-то вроде этого:

def get_at_line(lst, line): 
    # do some validation here 
    return lst[line-1] 

x, y = get_at_line(lst, 1) 
0

Просто замените

lst = [ast.literal_eval(line) for line in f.readlines()] 

for t in lst: 

с

for t in f.readlines(): 
1

my end goal is: take the values x, y, of the line 1 and use them in other function, when this function is done, return the line 2 and take other values for do it again, and stop when my lenght of my file is done.

Похоже, вы хотите функцию, которая итеративно yield сек значения из файла. Пример реализации:

import ast 

def readfile(): 
    with open('file.log', 'r') as f: 
     for line in f: 
      yield ast.literal_eval(line) 

def do_something(a,b): 
    print "I am doing something with {} and {}".format(a,b) 

for x,y in readfile(): 
    do_something(x,y) 

Результат:

I am doing something with 1 and 4 
I am doing something with 569 and 39 
I am doing something with 49 and 69 
Смежные вопросы