Arhn - архитектура программирования

Удаление строк файла в Python

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

Мой код:

try:
    a = open("data", "r+")
except FileNotFoundError:
    a = open("data", "w")
a = open("data", "r+")
b = a.read()
user = input("Username: ")
user2 = list(user)
if user in b:
    old = input("What is your old highscore? ")
    new = input("What is your new highscore? ")
    b2 = b.split()
    for line in b2:
        #Where I want to edit.
        line=line.replace(old, new)
        print(line)

else:
    new = input("What is your highscore? ")
    a.write(user + " " + new + "\n")
a.close()

Кто-нибудь знает, как в файле заменить старое на новое?

13.11.2015

Ответы:


1

Я бы посоветовал вам перейти на какой-нибудь стандартный формат сохранения информации, такой как JSON, YAML, XML, CSV, pickle или другой. Затем вам нужно прочитать и проанализировать файл в собственной структуре данных (вероятно, dict в этом случае), изменить его (это тривиально) и записать его обратно.

Пример с json (удобочитаемый, довольно простой в использовании):

import json

# loading data
try:
    with open("data") as a:
        b = json.load(a) # b is dict
except FileNotFoundError:
    b = {}

# user 
name = input("What's your name? ")
score = int(input("What's your high score? "))

# manipulating data
b[name] = score

# writing back 
with open("data", "w") as a:
    json.dump(b, a)

Пример с shelve (неудобочитаемый, но чрезвычайно простой в использовании):

import shelve

name = input("What's your name? ")
score = int(input("What's your high score? "))

with shelve.open("bin-data") as b:
    b[name] = score # b is dict-like
13.11.2015
  • Что касается полки, как бы вы использовали это для доступа к данным, чтобы человек мог прочитать свой рекорд? Является ли это возможным? Спасибо 13.11.2015
  • @space482: Да, это тривиально. b в основном ведет себя как dict, с ним можно делать большую часть того, что можно делать с обычными диктофонами, используя тот же синтаксис. Когда я сказал, что это не читается человеком, я имел в виду только то, что если вы откроете файл с помощью текстового редактора, вы не сможете прочитать данные. 13.11.2015
  • Еще один вопрос, извините. Как бы вы распечатали имя пользователя и высокий балл из файла? Это возможно? Спасибо еще раз 13.11.2015
  • Результатом загрузки файла является словарь, стандартная структура данных Python. Есть способы повторить это, все они подробно описаны в документации по python. 13.11.2015
  • @deets Спасибо за помощь. 13.11.2015
  • @deets: если быть точным: shelve.open возвращает объект, похожий на словарь. 13.11.2015
  • @space482: Обзор словарей Python 13.11.2015
  • @GingerPlusPlus Спасибо за всю помощь, признателен. 13.11.2015

  • 2

    Простой ответ: это невозможно. Операционные системы и их файловые операции не имеют понятия «строки». Они имеют дело с блоками двоичных данных. Некоторые библиотеки, такие как стандартная библиотека Python, помещают над этим удобную абстракцию для чтения строк, но они не позволяют обращаться к отдельным строкам.

    Итак, как решить проблему? Просто откройте файл, прочитайте все строки, манипулируйте соответствующей строкой на месте, а затем снова запишите весь файл.

     import tempfile
    
     highscore_file = tempfile.mktemp()
    
     with open(highscore_file, "w") as outf:
         outf.write("peter 1000\nsarah 500\n")
    
     player = "sarah"
     score = 2000
    
     output_lines = []
     with open(highscore_file) as inf:
         for line in inf:
             if player in line:
                 # replace old with new line. Don't forget trailing newline!
                 line = "%s %i\n" % (player, score)
             output_lines.append(line)
    
     with open(highscore_file, "w") as outf:
         outf.write("".join(output_lines))
    
    
    
     with open(highscore_file) as inf:
         print inf.read()
    
    13.11.2015
  • Как получить доступ к данным после закрытия файла? Спасибо 13.11.2015
  • Я не понимаю вашего вопроса. Вы можете прочитать данные, открыв файл. Как показывает мой сценарий. Итак - чего не хватает? 13.11.2015
  • При запуске данные не сохраняются. 13.11.2015
  • когда бежишь что? Мой код? Тогда спасет. Это доказывает, что он сохраняет данные, потому что считывает их в последних двух строках и распечатывает, доказывая, что обновление счета Сары до 2000 работает. 13.11.2015

  • 3

    Во-первых, после

    b = a.read()
    

    записывать

    a.close()
    a = open("data","w")
    

    Посмотрите, куда это вас приведет.

    13.11.2015
  • Спасибо, 1 проблема, теперь, когда я пытаюсь заменить рекорд, он просто удаляет данные, а не заменяет их, есть идеи? 13.11.2015
  • Да, посмотрите на ответ @deets; мой ответ, вероятно, привел вас к тому, что он пишет только одну строку, в то время как вам нужно заставить свой код писать все заново, заменяя одну строку. 13.11.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..