Добавить 1 к целочисленному значению в текстовом файле, а затем записать это новое значение поверх старого значения? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь получить количество посещенных сеансов игры в гольф, которое существует в позиции [1] в текстовом файле, и добавить 1 к нему. Я сумел сделать это, но теперь хочу обновить целочисленное значение. В настоящее время программа просто записывает новое значение в следующую строку вместо обновления.

with open("%s.txt" % month, 'r+') as f:
  for line in f:
    lineList = line.split(",")
    if golferssName == lineList[0]:
      numSessions = int(lineList[1])
      numSessions = int(numSessions) + 1
      ineList[1] = numSessions
      f.write(str(lineList[1]))

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

Tom Jones,1
2

Я хочу, чтобы 2 было где 1: (

Ответы [ 5 ]

1 голос
/ 01 апреля 2020

Считать все данные в списки строк, изменить строку, записать данные обратно. Я решил создать новый файл:

month = "April"
swimmersName = "Tom Jones"

with open(f"{month}.txt","w") as f:
    f.write(f"{swimmersName},3\nTim,50")

data = []
with open(f"{month}.txt") as f:
        for line in f:
            if line and ("," in line):
                data.append( line.strip().split(",") )
                if data[-1][0] == swimmersName:
                    data[-1][1] = str(int(data[-1][1])+1)

with open(f"{month}_new.txt","w") as w:
        for (user,visits) in data:
            w.write(f"{user},{visits}\n")

print(open(f"{month}.txt").read())
print(open(f"{month}_new.txt").read())

Вывод:

# April.txt
Tom Jones,3
Tim,50

# April_new.txt
Tom Jones,4
Tim,50

См. Как правильно перезаписать файл?

Если вы вам нужно работать с несколькими пловцами, вы можете захотеть взглянуть на Изменить значение c в CSV-файле также с помощью Python.

0 голосов
/ 01 апреля 2020

Опция без буфера с использованием csv и os:

import csv, os

swimmersName = 'Tom Jones'
in_file = 'test.txt'

with open(in_file, newline='') as csv_reader:
    with open('temp.txt', mode='w', newline='') as csv_writer:
        reader = csv.reader(csv_reader, delimiter=',')
        writer = csv.writer(csv_writer, delimiter=',')
        for row in reader:
            if row[0] == swimmersName:
                row[1] = int(row[1]) + 1
            writer.writerow(row)

os.rename('temp.txt', in_file)
0 голосов
/ 01 апреля 2020

это может быть другое решение:

with open("%s.txt" % month, 'r') as f:
    newfilelines = []
    filelines = f.readlines()
    for fileline in filelines:
        lineList = fileline.split(",")
        if swimmersName == lineList[0]:
            lineList[1] = int(lineList[1]) + 1
            newfilelines.append(lineList[0] + ',' + str(lineList[1]) + '\n')
with open("%s.txt" % month, 'w') as f:
    for newfileline in newfilelines:
        f.write(newfileline)
0 голосов
/ 01 апреля 2020

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

out = []
with open("path", 'r+') as f:
  for line in f:
    lines = line.split(",")

    numSessions = int(lines[1])
    numSessions = int(numSessions) + 1
    lines[1] = numSessions
    out.append(lines)
print(out)
lines  = [','.join(map(str,i)) for i in out]
print(lines)
with open("path", 'w') as f:
  f.writelines(lines)

Что-то в этом роде.

Надеюсь, это поможет.

0 голосов
/ 01 апреля 2020

Я бы использовал такой подход:

out = ""

with open("foo.txt","r+") as f:
    for line in f:
        tokens = line.split(",")
        out += tokens[0] + "," + str(int(tokens[1])+1) + "\r\n"

    f.seek(0)
    f.write(out)

Прочитайте весь файл, изменив каждую строку, как вам нужно, и постройте вывод, как вы go. Затем, как только вы прочитаете весь файл, вернитесь к началу файла и перезапишите старое содержимое новым.

...