2014-02-06 4 views
2

У меня есть текстовый файл с разделителями-табуляцией фильмов и актеров. Записи в следующем формате:преобразование части текстового файла в список

The Shawshank Redemption ["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"] 

The Dark Knight ["Christian Bale", "Heath Ledger", "Aaron Eckhart", "Michael Caine"] 

Есть простой способ, чтобы питон относиться к актеру «список» в качестве структуры данных списка питона, а не строк с [ и ] символами? Я попытался написать код, чтобы разрезать строку, начинающуюся с [ характера, обирать [, ] и " использованием .strip() и .rstrip(), а затем с помощью .split(' ,') составить список из оставшейся строки. но это не принесло результатов, которые я хотел.

ответ

2

ast.literal_eval, safer версия функции eval() python, которая берет ввод строки и обрабатывает ее как код python. Предполагая, что всегда есть одна позиция табуляции, вы можете разделить с закладками '\t' просто оценить второй элемент:

import ast 
for line in f.readlines(): 
    temp_list = ast.literal_eval(line.split('/t')[1]) 
    # do something 

Просто пробоя, используя свою первую строку в качестве примера:

>>> first_line = "The Shawshank Redemption ["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"]" 
>>> split_line = first_line.split('/t') 
>>> split_line 
['The Shawshank Redemption', '["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"]'] 
>>> best_list_ever = ast.literal_eval(split_line[1]) 
>>> best_list_ever 
["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"] 
+0

Я не знаком с Функция eval(), почему это безопаснее? – Mike

+0

@Mike перейдите по ссылке. Короче говоря, 'eval' будет оценивать абсолютно все, включая os.system ('rm -rf /') (НЕ ДЕЛАЙТЕ ЭТО), что буквально начнет удалять все ваши файлы. Конечно, на крошечном скрипте python, сохраненном локально на вашем компьютере, не так много шансов на это, но хорошей практикой в ​​программировании является использование 'literal_eval' в любом случае. Единственное различие между ними состоит в том, что 'literal_eval' будет оценивать только допустимые структуры данных python. – jayelm

+0

Спасибо за разъяснение, прочитав эти документы, это имеет смысл. ТАКЖЕ, моя новая переменная списка по умолчанию официально стала «best_list_ever» – Mike

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