2013-12-08 5 views
1

Я работаю над школьным проектом, чтобы сделать программу управления видео-клубом, и мне нужна помощь. Вот то, что я пытаюсь сделать: У меня есть текстовый файл с данными клиента, в котором есть этаmodifiying txt-файл в python 3

clientId:clientFirstName:clientLastName:clientPhoneNumber 

: это Seperator для любого файла в данных и в файле данных фильмов в заголовке получил это

movieid:movieKindFlag:MovieName:MovieAvalaible:MovieRented:CopieInTotal 

, где происходит то, что в файле rentedData должно быть, что

idClient:IdMovie:DateOfReturn 

эту часть я могу это сделать, где я из-за недостатка опыта Мне нужно сделать контейнер с 3 уровнями для файла данных фильма, потому что я хочу отслеживать доступный и арендованный номер (меняя их, когда снимаю фильм и когда я его возвращаю) первый уровень представляете собой файл отверстия, вызов будет распечатать файл отверстие второго уровня должен иметь каждую строку в контейнере третья является каждым словом строки в контейнере

здесь является Exemple того, что я имею в виду

dataMovie = [[[movie id],[movie title],[MovieAvailable],[MovieRented],[CopieInTotal]],[[movie id],[movie title],[MovieAvailable],[MovieRented],[CopieInTotal]] 

i действительно знаю, что я могу сделать это для двух слоев таким образом

DataMovie=[] 
    MovieInfo = open('Data_Movie', 'r') 
    #Reading the file and putting it into a container 
    for ligne in MovieInfo: 
     print(ligne, end='') 
     words = ligne.split(":") 
     DataMovie.append(words) 
    print(DataMovie) 

    MovieInfo.close() 

это разделите все слово, чтобы тот

[[MovieID],[MovieTitle],[movie id],[movie title],[MovieAvailable],[MovieRented],[CopieInTotal], [MovieID],[MovieTitle],[movie id],[movie title],[MovieAvailable],[MovieRented],[CopieInTotal]] 

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

спасибо за вашу помощь

+0

нашел путь я должен был сделать это определение функции GetActionData(): \t \t dataAction = открытый ('Data_Film_Action', 'г') \t для Ligne в dataAction: \t \t сбросить # Эта контейнер так, каждая строка в одном контейнере \t \t dataFilmActionTemp = [] \t \t #print (Ligne, конец = '') \t \t Ligne = ligne.rstrip ('\ п') \t \t #The линия над удалить anoying \ N \t \t словечки = ligne.split (":") \t \t для MOT в главных слов: \t \t \t dataFilmActionTemp.append (MOT) \t \t dataFilmAction.append (dataFilmActionTemp) \t dataAction.close() \t время.sleep (3) \t \t return (dataFilmAction) ' – GothSparkImvu

ответ

0

Я думаю, вы должны использовать словари сохраните свои данные. Вместо этого просто встраивание списков друг на друга.

Предлагаем вам краткую информацию о словарях. http://www.network-theory.co.uk/docs/pytut/Dictionaries.html

Так что ваши данные могут выглядеть

movieDictionary = {"movie_id":234234,"movie title":"Iron 
    Man","MovieAvailable":Yes,"MovieRented":No,"CopieInTotal":20} 

Затем, когда вы хотите, чтобы получить значение.

movieDictionary["movie_id"]

даст значение.

234234 

вы также можете вставлять списки внутри значения словаря.

Помогло ли это ответить на вопрос?

+0

, который может в некотором роде, но я вынужден сказать, что мне действительно нужно использовать txt-файл вместо жесткого кодирования всего, есть способ использовать его таким образом ? – GothSparkImvu

0

Если вам нужно использовать txt-файл, его сохранение в формате xml может облегчить задачу. Поскольку на python уже есть несколько хороших XML-парсеров.

Например ElementTree:

Вы можете структурировать you'r данные, как это:

<?xml version="1.0"?> 
<movies> 
<movie id = "1"> 
    <type>movieKind</type> 
    <name>firstmovie</name> 
    <MovieAvalaible>True</MovieAvalaible> 
    <MovieRented>False</MovieRented> 
    <CopieInTotal>2</CopieInTotal> 
</movie> 
<movie id = "2"> 
    <type>movieKind</type> 
    <name>firstmovie2</name> 
    <MovieAvalaible>True</MovieAvalaible> 
    <MovieRented>False</MovieRented> 
    <CopieInTotal>3</CopieInTotal> 
</movie> 
</movies> 

а затем получить доступ и изменить его следующим образом:

import xml.etree.ElementTree as ET 

tree = ET.parse('data.xml') 
root = tree.getroot() 

search = root.findall('.//movie[@id="2"]') 
for element in search: 
    rented = element.find('MovieRented') 
    rented.text = "False" 

tree.write('data.xml') 
+0

как для выше, которые были бы прекрасно настроены, но я не могу импортировать модуль базы данных, а html - один из них печально – GothSparkImvu

+0

Зачем вам нужен модуль базы данных или html для этого? Модуль дерева элементов может анализировать .txt так же, как файлы .xml. Так что просто отформатируйте свой .txt с данными xml. До тех пор, пока вы можете загрузить модуль дерева элементов и можете читать \ писать файлы .txt, это должно работать? – M4rtini

+0

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

0

То, что вы фактически делаете создает три базы данных:

  • один для клиентов
  • один для фильмов
  • один для аренды

Относительно простой способ для чтения текстовых файлов с одной записью в строке и : сепараторе создать csv.reader объект. Для хранения баз данных в вашей программе я бы рекомендовал использовать списки объектов collections.namedtuple для клиентов и аренды.

from collections import namedtuple 
from csv import reader 

Rental = namedtuple('Rental', ['client', 'movie', 'returndate']) 
with open('rentals.txt', newline='') as rentalsfile: 
    rentalsreader = csv.reader(rentalsfile, delimiter=':') 
    rentals = [Rental(int(row[0]), int(row[1]), row[2]) for row in rentalsreader] 

И список словарей для фильмов:

with open('movies.txt', 'rb', newline='') as moviesfile: 
    moviesreader = csv.reader(moviesfile, delimiter=':') 
    movies = [{'id': int(row[0]), 'kind', row[1], 'name': row[2], 
       'rented': int(row[3]), 'total': int(row[4])} for row in moviesreader] 

Основной причиной использования списка словарей для фильмов является то, что названный кортеж кортеж и, следовательно, неизменен, и, вероятно, вам хочет иметь возможность изменить rented.

Ссылаясь на ваш комментарий на ответ Daniel Расмусона, так как вы только положить значения полей в текстовых файлах, вам придется hardocde имена полей в вашей программе, так или иначе.

Альтернативное решение - хранить дату в json файлах. Они легко сопоставляются структурам данных Python.

+0

это точно хочу, я хотел сделать, но я не могу ограничиться для projeck Я не могу импортировать csv – GothSparkImvu

+0

@GothSparkImvu Если вы не можете использовать csv, просто используйте, например. 'for line in moviesfile' перебирать строки. И используйте 'row = line.split()' для разделения строки. –

0

Это может быть то, что вы, мы ищем

#Using OrderedDict so we always get the items in the right order when iteration. 
#So the values match up with the categories\headers 
from collections import OrderedDict as Odict 

class DataContainer(object): 

    def __init__(self, fileName): 
     ''' 
     Loading the text file in a list. First line assumed a header line and is used to set dictionary keys 
     Using OrderedDict to fix the order or iteration for dict, so values match up with the headers again when called 
     ''' 
     self.file = fileName 
     self.data = [] 
     with open(self.file, 'r') as content: 
      self.header = content.next().split('\n')[0].split(':') 
      for line in content: 
       words = line.split('\n')[0].split(':') 
       self.data.append(Odict(zip(self.header, words))) 

    def __call__(self): 
     '''Outputs the contents as a string that can be written back to the file''' 
     lines = [] 
     lines.append(':'.join(self.header)) 
     for i in self.data: 
      this_line = ':'.join(i.values()) 
      lines.append(this_line) 
     newContent = '\n'.join(lines) 
     return newContent 

    def __getitem__(self, index): 
     '''Allows index access self[index]''' 
     return self.data[index] 

    def __setitem__(self, index, value): 
     '''Allows editing of values self[index]''' 
     self.data[index] = value 

d = DataContainer('data.txt') 
d[0]['MovieAvalaible'] = 'newValue' # Example of how to set the values 

#Will print out a string with the contents 
print d()