Próbuję uzyskać liczbę sesji golfowych, w których uczestniczyłem, a która istnieje na pozycji [1] w pliku tekstowym i dodać do niej 1. Musiałem to zrobić, ale teraz chcę zaktualizować wartość całkowitą. Obecnie program po prostu zapisuje nową wartość w następnej linii zamiast aktualizować.

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]))

W tej chwili plik tekstowy wygląda następująco:

Tom Jones,1
2

Chcę, żeby 2 było tam, gdzie jest 1 :(

0
David Lamb 1 kwiecień 2020, 16:33

5 odpowiedzi

Najlepsza odpowiedź

Mogłoby to być inne rozwiązanie:

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
gekigek99 1 kwiecień 2020, 16:09

Wczytaj wszystkie dane do listy linii, zmodyfikuj linię, zapisz dane z powrotem. Wybieram utworzenie nowego pliku:

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())

Wynik:

# April.txt
Tom Jones,3
Tim,50

# April_new.txt
Tom Jones,4
Tim,50

Zobacz Jak poprawnie nadpisać plik?

Jeśli musisz obsługiwać wielu pływaków, możesz rzucić okiem na Zmień określona wartość w pliku CSV również za pośrednictwem Pythona.

1
Patrick Artner 1 kwiecień 2020, 13:53

Zastosowałbym takie podejście:

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)

Przeczytaj cały plik, modyfikując każdą linię zgodnie z potrzebami i twórz wyniki w miarę postępów. Następnie, po przeczytaniu całego pliku, przejdź do początku pliku i nadpisz starą zawartość nowymi.

0
Kexus 1 kwiecień 2020, 13:50

Będziesz musiał przeczytać ten plik do bufora, edytować go i ponownie zapisać w pliku.

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)

Coś w tym stylu.

Mam nadzieję, że to pomoże.

0
Nivardo Albuquerque 1 kwiecień 2020, 13:53

Opcja bez bufora przy użyciu CSV i 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
Saxasmu 1 kwiecień 2020, 14:12