Как добавлять линии к файлу и издавать их?

Хорошие

Они будут видеть я новый в python и нуждаюсь в помощи, чтобы читать файлы txt.

У меня есть следующий код:

id = str(input("DIGITE ID ESTUDIANTE"))
nombre = str(input("digite nombre"))
edad = str(input("digite edad"))
ciudad = str(input("digite direccion"))

def grabartxt():
    archi=open('datos.txt','a')

    archi.write("ID:")
    archi.write(id)
    archi.write("\n")
    archi.write('Nombre:')
    archi.write(nombre)
    archi.write("\n")
    archi.write("Edad:")
    archi.write(edad)
    archi.write("\n")
    archi.write("direccion:")
    archi.write(ciudad)
    archi.write("\n")
    archi.close()

То, в чем я нуждаюсь, состоит в том, чтобы, уже созданный файл txt с информацией нескольких человек, мочь искать информацию в специфическом средстве, мы сказали, что id, и кроме того мочь изменять это, если я этого требую.

0
задан 27.11.2018, 11:14
3 ответа

В действительности это мне не кажется очень сложным. Во-первых crear¦ - в файл CSV для большей возможности использования. Секунда, crear¦ - в класс Student, где я хранил стоимость каждого студента, этот класс tendr¦ - в два métodos: один, чтобы наполнять данные и другой, чтобы это помещать в способ edici¦n. Отдельно, tendr¦ - в класс, который actúe как Хранилище на файле студентов для того, чтобы añada , искал и , издавало бы студентов. Из-за último, pondr¦ - в один menú посвященный opci¦n искать с выборами: издавать и направлять (в menú главный).

import sys
import time
import fileinput
from os import system
from os.path import isfile

class Student:
  def fill(self):
    self.id = input("ID: ")
    self.name = input("Nombre: ")
    self.age = int(input("Edad: "))
    self.address = input("Dirección: ")

  def edit_mode(self):
    self.id = input("ID: (enter to skip) ") or self.id
    self.name = input("Nombre: (enter to skip) ") or self.name
    self.age = input("Edad: (enter to skip) ") or self.age
    self.address = input("Dirección: (enter to skip) ") or self.address

  def to_csv_line(self):
    return f"{self.id},{self.name},{self.age},{self.address}"

class StudentRepository:
  @classmethod
  def create(self, student):
    with open("students.csv", "a") as file:
      file.write("\n")
      file.write(student.to_csv_line())

  @classmethod
  def edit(self, student):
    with fileinput.FileInput("students.csv", inplace=True, backup=".bak") as file:
      for line in file:
        data = line.split(",")
        if (data[0] == student.id):
          print(student.to_csv_line())
          return None

  @classmethod
  def search(__self, id):
    student = None
    with open("students.csv", "r") as file:
      for line in file:
        data = line.split(",")
        if data[0] == id:
          student = Student()
          student.id = data[0]
          student.name = data[1]
          student.age = int(data[2])
          student.address = data[3]
          return student


# Menú principal
def menu():
  option = input("""
  +==========================================+
  |                                          |
  |          Control de estudiantes          |
  |                                          |
  +==========================================+

  [?] Seleccione opción:

  1. Ingresar un estudiante
  2. Buscar un estudiante
  3. Salir

  > """)

  if option == "1":
    student = Student()
    student.fill()
    StudentRepository.create(student)
    print("""
  [✓] Estudiante creado.
  [↺] Volviendo al menú en 2s
    """)
    time.sleep(1.5)
    system("clear")
    return menu()

  if option == "2":
    id = input("\nIngresa el ID: ")
    student = StudentRepository.search(id)
    if student is not None:
      return search_menu(student)
    else:
      print("""
  [✕] Estudiante no encontrado.
  [↺] Volviendo al menú en 2s
      """)
      time.sleep(1.5)
      system("clear") # limpia la pantalla
      menu()
  if option == "3":
    print("Good Bye")
    sys.exit(0)

# Menú de búsqueda
def search_menu(student):
  option = input(f"""
  [✓] Estudiante encontrado:

  ID: {student.id}
  Nombre: {student.name}
  Edad: {student.age}
  Dirección: {student.address}

  [?] Seleccione opción:

  1. Editar estudiante
  3. Volver

  > """)

  if (option == "1"):
    student.edit_mode()
    StudentRepository.edit(student)
    print("""
  [✓] Estudiante actualizado:
  [↺] Volviendo al menú en 2s
    """)
    time.sleep(2)
    system("clear")
    return menu()
  if option == "3":
    system("clear")
    return menu()

menu()

Замечает: c¦digo должен распространяться в Пайтоне 3.6 или заменять interpolaci¦n текста. También я предполагаю смоги быть улучшенным использованием lambdas, но я не очень приучен aún для этой концепции в Пайтоне.

1
ответ дан 03.12.2019, 15:48
  • 1
    твоя идея очень хорошая ты это agradesco, только одна консультируется, как я делаю, если я поступаю новый студент, и если она была уже этой, что он сказал мне, что или он является вписанным –  Luis David Jimenez 17.04.2017, 01:14
  • 2
    ты можешь помогать мне во время повторно писания архива students он это не делает я верю q в этот недостаток в этой линии with fileinput. FileInput (" students.csv" inplace=True, backup =" .bak") эксперт file: но я не уверен –  Luis David Jimenez 17.04.2017, 06:59
  • 3
    @LuisDavidJimenez có я говорю está попробованный в Пайтоне 3.6. ¿ Ты получаешь algú n ошибка? –  gugadev 17.04.2017, 07:38
  • 4
    @LuisDavidJimenez он Это забывал. Если está s в Windows он удаляет инструкции system("clear"), потому что оно только функционирует в UNIX. –  gugadev 17.04.2017, 15:36
  • 5
    если я изменяю, какой-то студент создает мне два архива students.csv (он остается в мишени) и students.csv.bak, и если я реализую поиски уже вошедшего какого-либо, говорит мне, что он не, вышеупомянутое одинокое перемещает, если раньше я попробовал изменять это –  Luis David Jimenez 17.04.2017, 21:57

Так как конечно, что есть способы mÃ: s работоспособные делания этого, но podr¦-схвати читать весь файл переворачивая это в array. Искать идентификацию, и если ты это находишь заменять стоимость. Продолжая немного формат, который env¦-схвати:

    def buscartxt():
        try:
            archi=open('datos.txt','r+');
        except FileNotFoundError:
            ## Si archivo Nuevo directamente grabo
            grabartxt();
        else:
            # Leo el archivo completamente
            with open('datos.txt', 'r') as file:
                datos = file.readlines()
            # Busco si está el ID en el archivo
            encontrado = False;
            buscoId = "ID:"+id+'\n'
            for i,v in enumerate(datos):
                if v == buscoId:
                    # Id encontrado. Reemplazo todo
                    datos[i+1] = 'Nombre:'+nombre+'\n';
                    datos[i+2] = 'Edad:'+edad+'\n';
                    datos[i+3] = 'direccion:'+ciudad+'\n';
                    encontrado = True;
                    break;
            # Si he encontrado el ID, grabo todo el archivo, si no, proceso de grabar txt
            if encontrado is True:
                archi = open('datos.txt', 'w')
                for linea in datos:
                    archi.write(linea)
            else : 
                grabartxt()
0
ответ дан 03.12.2019, 15:48

Opci¦n состоит в том, чтобы читать файл l¦-nea из-за линии. Â: Необходимо, чтобы ты сохранял данные в различных l¦-neas? Потому что ты ser¦ - в mÃ: s fÃ: cil в única:

id:1; nombre:a; edad:b; direccion:c Пока ты обращаешься l¦-nea из-за l¦-nea состоит в том, чтобы отделять

каждая из цепей отделенные из-за";" используя funci¦n split (), después из-за ":" и сравнивать, если id соответствует с определенным.

0
ответ дан 03.12.2019, 15:48
  • 1
    он мог бы быть в той же цепи, но как он сделал бы, чтобы менять информацию или это искать? –  Luis David Jimenez 16.04.2017, 21:58

Теги

Похожие вопросы