Porównaj ceny domen i usług IT, sprzedawców z całego świata

Dodaj wiersz do istniejącego pliku w Pythonie


Muszę dodać jedną linię do pierwszej linii pliku tekstowego i wygląda na to, że jedyne dostępne dla mnie opcje to więcej linii kodu, niż spodziewałbym się po Pythonie. Coś w tym stylu:
f = open('filename','r')
temp = f.read()
f.close()f = open('filename', 'w')
f.write("#testfirstline")f.write(temp)
f.close()

Czy nie ma łatwiejszego sposobu? Ponadto widzę ten przykład z dwoma uchwytami częściej niż otwieranie jednego uchwytu do odczytu i zapisu („r +”) - dlaczego tak jest?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Python upraszcza wiele rzeczy i zawiera biblioteki i opakowania dla wielu typowych operacji, ale celem nie jest ukrycie fundamentalnych prawd.
Podstawową prawdą, z którą się tutaj spotykasz, jest to, że zwykle nie możesz dodać danych do istniejącej płaskiej struktury bez nadpisania całej struktury. Dzieje się tak niezależnie od języka.
Istnieją sposoby, aby zachować uchwyt pliku lub uczynić kod mniej czytelnym, z których wiele jest podanych w innych odpowiedziach, ale żaden z nich nie zmienia podstawowej operacji: musisz odczytać istniejący plik, a następnie zapisać dane, które chcesz dodać, a następnie istniejące dane, które czytasz.
Zapisz uchwyt pliku za wszelką cenę, ale nie próbuj pakować operacji w jak najmniejszą liczbę wierszy kodu. W rzeczywistości nigdy nie szukaj najmniejszej liczby wierszy kodu - to zaciemnianie, a nie programowanie.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Trzymałbym się osobnego czytania i pisania, ale możemy oczywiście wyrazić je bardziej zwięźle:
Zamiast python2:
with file('filename', 'r') as original: data = original.read()
with file('filename', 'w') as modified: modified.write("new first line\n" + data)

Python3:
with open('filename', 'r') as original: data = original.read()
with open('filename', 'w') as modified: modified.write("new first line\n" + data)

Uwaga: funkcja file () nie jest dostępna w python3.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Inne podejście:
with open("infile") as f1:
with open("outfile", "w") as f2:
f2.write("#test firstline")
for line in f1:
f2.write(line)

lub jedna wkładka:
open("outfile", "w").write("#test firstline\n" + open("infile").read())

Dzięki za możliwość przemyślenia tego problemu :)
Owacja
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

with open("file", "r+") as f: s = f.read(); f.seek(0); f.write("prepend\n" + s)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz zapisać jedno wywołanie rekordu za pomocą tego:
f.write('#testfirstline\n' + temp)

Używając 'r +', będziesz musiał przewinąć plik do tyłu po przeczytaniu i przed zapisaniem.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto 3 wkładki, które moim zdaniem są jasne i elastyczne. Używa funkcji list.insert, więc jeśli naprawdę chcesz dodać przedrostek do pliku, użyj l.insert (0, 'insert_str'). Kiedy faktycznie zrobiłem to dla rozwijanego przeze mnie modułu Pythona, użyłem l.insert (1, 'insert_str'), ponieważ chciałem pominąć wiersz '# -

- coding: utf-8 -

- 'w linii 0. To jest kod.
f = open(file_path, 'r'); s = f.read(); f.close()
l = s.splitlines(); l.insert(0, 'insert_str'); s = '\n'.join(l)
f = open(file_path, 'w'); f.write(s); f.close()
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wykonuje to zadanie bez wczytywania całego pliku do pamięci, chociaż może to nie działać w systemie Windows
def prepend_line(path, line):
with open(path, 'r') as old:
os.unlink(path)
with open(path, 'w') as new:
new.write(str(line) + "\n")
shutil.copyfileobj(old, new)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jedna z możliwości jest następująca:
import os
open('tempfile', 'w').write('#testfirstline\n' + open('filename', 'r').read())
os.rename('tempfile', 'filename')
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli chcesz dodać przedrostek po określonym tekście do pliku, możesz skorzystać z poniższej funkcji.
def prepend_text(file, text, after=None):
''' Prepend file with given raw text '''
f_read = open(file, 'r')
buff = f_read.read()
f_read.close()
f_write = open(file, 'w')
inject_pos = 0
if after:
pattern = after
inject_pos = buff.find(pattern)+len(pattern)
f_write.write(buff[:inject_pos] + text + buff[inject_pos:])
f_write.close()

Więc najpierw otwierasz plik, czytasz go i zapisujesz wszystko w jednym wierszu.
Następnie staramy się znaleźć numer znaku w linii, w której nastąpi wstrzyknięcie. Następnie za pomocą pojedynczego rekordu i inteligentnego indeksowania wiersza możemy przepisać cały plik, łącznie z wprowadzonym tekstem.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie widzę czegoś, czy możemy po prostu użyć bufora wystarczająco dużego, aby wczytać plik wejściowy

fragmentaryczny

(zamiast całej zawartości) i używając tego bufora do przechodzenia przez plik,

gdy jest otwarta

i czy kontynuować wymianę zawartości pliku & < - & > buffer?
Wydaje się to być znacznie wydajniejsze (szczególnie w przypadku dużych plików) niż czytanie


Całkowity
zawartość

na myśli

zmieniając to

na myśli

i zapisując z powrotem do tego samego pliku lub (co gorsza) do innego. Przepraszamy, nie mam teraz czasu na zaimplementowanie przykładowego fragmentu kodu. Wrócę do tego później, ale być może zrozumiesz, o co chodzi.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się