2017-01-02 6 views
1

Я пишу создателя турнира для игры, в которой ее нет, только для личного использования. Это хорошее упражнение для школы ... однако, я наткнулся на проблему, закончив программу.Как преобразовать строку в файл обратно в список в Python?

Итак, после того, как участники турнира были решено, я спрашиваю у пользователя (сам, мой кузен тоже самое, если он подходит), если он хочет сохранить текущий список участников. Если да, то список, содержащий участников будет записано в файл:

fileWrite = open('Previous Participants', 'w') 
fileWrite.write(str(participants2)) 
fileWrite.close() 

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

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

В настоящее время файл имеет следующую строку в прошлый раз:

['Cell', 'Lord Slug', 'Time Patroller', 'Gotenks', 'Omega Shenron', 'Nail', 'Time Breaker Bardock', 'Piccolo', 'Frieza', 'Mr. Satan', 'Beerus', 'Nappa', 'Raspberry', 'Goten', 'Vegito', 'Goku'] 

Участники, как «Lord слизняк» вызовет проблемы, если я:

ownCharacters = input('Do you wish to use the same participants as last time? ') 
if ownCharacters == 'yes' or ownCharacters == 'Yes': 
    try: 
     fileRead = open('Previous Participants', 'r') 
     participants2 = fileRead.read() 
     participants2.split 
    except FileNotFoundError: 
     participants2 = participants2 

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

+0

Почему бы не использовать что-то вроде 'outputnames = ','. Join (участники2)' перед записью в файл, сделав его CSV. вы можете изменить, любому персонажу, который вы запрещаете в именах – jeremycg

ответ

4

Один лучший способ сделать это писать имена в файл по одному на строку:

fileWrite.write('\n'.join(participants2)) 

Затем вы можете получить список имен через readlines:

participants2 = fileRead.readlines() # elements will will need to be stripped 

Но , надлежащим способом сериализации данных в файлы является использование тестируемой библиотеки, такой как pickle или json:

import json 
# import pickle 

with open('file.json', 'w') as f: 
    json.dump(participants, f) 
    # pickle.dump(participants, f) 

Затем вы можете получить список с помощью:

with open('file.json', 'r') as f: 
    participants = json.load(f) 
    # participants = pickle.load(f) 
+0

Спасибо!Первый работал, и я пошел с этим для простоты на данный момент. Но я сделал заметку о вашем другом, «правильном» решении. Некоторая отличная информация, которую вы опубликовали: D – DiaborMagics

2

Не записывайте список как строку. Существует несколько способов сделать это. Наиболее распространенным было бы либо писать каждого пользователя в другой строке файла, либо использовать csv (или какой-либо другой тип разделителя).

import csv 

with open('file_name.csv', newline='') as fh: 
    writer = csv.writer(fh) 
    writer.writerow(participants2) 
0

список записи сначала через присоединиться: file.write(','.join(list))

читать и использовать split, чтобы получить список обратно:

data = file.read() #read data list = data.split(',')#split data

для нескольких списков разные уровни разделения могут работать