2015-11-22 2 views
1

У меня есть файл, содержащий мое школьное расписание, и я хочу создать список из каждой строки в файле. Файл выглядит примерно так:Использование функции exec() Python с форматированной строкой?

first:second:third:fourth:fifth 
first:second:third:fourth:fifth 

код заключается в следующем:

schedule_file = "school-schedule.txt" 
with open(schedule_file) as schedule: 
    for c, line in enumerate(schedule): 
     exec("ln%s = schedule.read().split(':')" % str(c+1)) 

print(ln1) 
print(ln2) 
print(ln3) 
print(ln4) 
print(ln5) 
print(ln6) 
print(ln7) 
print(ln8) 
print(ln9) 
print(ln10) 

Я знаю, что файл имеет десять строк, поэтому для целей тестирования, я хотел, чтобы напечатать эти десять списки. К сожалению, это, кажется, поставить первую строку в списке под названием ln1 и вызывает исключение NameError для всех других списков, начиная с ln2:

['first', 'second', 'third', 'fourth', 'fifth'] 
Traceback (most recent call last): 
    File "D:\schedule.py", line 10, in <module> 
    print(ln2) 
NameError: name 'ln2' is not defined 

Это не представляется возможным использовать отформатированные строки внутри функции exec() или я Я делаю другую глупую ошибку?

+3

Ваша ошибка заключается в использовании 'Exec()'. Избегайте его любой ценой. Вместо того, чтобы динамически создавать 10 переменных, просто используйте dict. – MattDMo

ответ

1
for c, line in enumerate(schedule): 
    exec("ln%s = schedule.read().split(':')" % str(c+1)) 

Строка из файла в переменную line, но Вы писали:

exec("ln%s = schedule.read().split(':').... 

вместо:

exec("ln%s = line.split(':')... 

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

print(ln1) 
print(ln2) 
print(ln3) 
print(ln4) 

, где имена переменных отличаются только числом, то вам нужно остановить то, что вы делаете, и использовать список вместо. Если у вас есть список с именем ln, то элементы в списке уже есть имена ln[0], ln[1] и т.д. Таким образом, вы можете сделать это:

with open('data.txt') as f: 
     ln = [line.rstrip().split(':') for line in f] 

print(ln) 
print(ln[0]) 
print(ln[1]) 

--output:-- 
$ cat data.txt 
a:b:c:d 
e:f:g:h 

$ python prog.py 
[['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h']] 
['a', 'b', 'c', 'd'] 
['e', 'f', 'g', 'h'] 
+0

Спасибо, тоже. Как я уже сказал в первом ответе, я не уверен, зачем мне десять переменных для этого. Использование списка намного проще и определенно более элегантно. –

1

Вы прочитали весь файл после первой итерации, так что вы никогда не пройти первый exec("ln%s = .....:

exec("ln%s = schedule.read().split(':')" % str(c+1)) 
         ^^^ 
        .read() # reads whole/rest of file 

Просто используйте readlines и доступ по индексу:

with open(schedule_file) as schedule: 
    data = schedule.readlines() 
ln1 = data[0].split(":") 
..... 

Или в сочетании с картой раздел:

data = list(map(lambda x: x.split(":"),schedule)) 

Вы также можете использовать диктофон, но это не реально Это будет больше пользы, чем просто использование списка и доступ по индексу.

Если вы действительно хотите десять переменных затем распаковывать:

with open(schedule_file) as schedule: 
    ln1,ln2 ....ln10 = map(lambda x: x.split(":"),schedule 
+0

Спасибо. Использование readlines и доступа по индексу намного проще, чем то, что я имел в виду. У вас есть чему поучиться :) Еще раз спасибо! –

+0

Не беспокойтесь, первый раз за все :) –

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