Istnieją określone wiersze, które chcę usunąć z pliku. Powiedzmy, że jest to linia 20-37, a następnie linia 45. Jak miałbym to zrobić bez określania zawartości tych linii?
text-processing
tshepang
źródło
źródło
Odpowiedzi:
Z
sed
:Jeśli chcesz to zrobić w miejscu:
źródło
ed
lub GNU sed-i
, lubsponge
, lub metody dużych plików .This option specifies that files are to be edited in-place. GNU
sed ”robi to, tworząc plik tymczasowy i wysyłanie danych wyjściowych do tego pliku zamiast na standardowe dane wyjściowe. ... Nie znam żadnego innego „sed”, ale logistyka aktualizacji „w miejscu” za pomocą edytora strumieniowego nie „oblicza” :)Jeśli plik wygodnie mieści się w pamięci, możesz również użyć
ed
.Polecenia są dość podobne do
sed
powyższego z jedną zauważalną różnicą : musisz przekazać listę numerów / zakresów linii, które mają zostać usunięte, w porządku malejącym (od najwyższego numeru linii / zakresu do najniższego). Powodem jest to, że kiedy usuwasz / wstawiasz / dzielisz / łączysz linieed
, bufor tekstowy jest aktualizowany po każdej podkomendie, więc jeśli usuniesz niektóre linie, reszta kolejnych linii nie będzie już w tej samej pozycji w buforze, gdy następna komenda jest wykonywana. Musisz zacząć od tyłu 1 . Edycja wmiejscu :
lub
lub
Zamień
w
obrzęd na,p
rint, jeśli chcesz wydrukować wynikowe wyjście zamiast pisać do pliku. Jeśli chcesz zachować oryginalny plik nienaruszony i zapisać w innym pliku, możesz przekazać nową nazwę pliku dow
komendy obrzędowej:1 Chyba że chcesz obliczyć nowe numery wierszy po każdym
d
elete, co w tym konkretnym przypadku jest dość trywialne (po usunięciu wierszy 20-37, tj. 18 wierszy, wiersz 45 staje się wierszem 27), abyś mógł uruchomić:Jeśli jednak musisz usunąć wiele numerów / zakresów linii, praca wstecz nie jest żadnym problemem.
źródło
q
polecenie jest przydatne na końcu? Wydaje mi się, że tak czy inaczej.Po prostu wczytaj go do pamięci, zmień, a następnie zapisz. Możesz zrobić coś takiego
Testowany z 5-wierszowym plikiem. Podziękowania dla http://pleac.sourceforge.net/pleac_python/fileaccess.html , patrz sekcja „Modyfikowanie pliku na miejscu bez pliku tymczasowego”. Zobacz także /programming/125703/how-do-i-modify-a-text-file-in-python
Niektóre uwagi:
Można najpierw obciąć plik, a następnie napisać do niego, zamiast pisać, a następnie obciąć, jak wyżej. Jednak nie znam flagi Pythona, która pozwala czytać, a następnie robić okrojone zapisy. Ale może coś mi brakuje, ponieważ dokument nie jest tak jasny. Co prowadzi mnie do
Czasami dokumenty Pythona są naprawdę do kitu. Zobacz http://docs.python.org/library/functions.html#open
Czy to coś dla ciebie znaczy? Co do cholery jest „otwarte na aktualizację”?
Nie wiem, czy robienie tego w Pythonie w przeciwieństwie do czegoś uniksowego, takiego jak edytor strumieni, jest lepsze. Może być bardziej przenośny, ale nie wiem, jak przenośny jest sed. Właśnie to napisałem, ponieważ czuję się bardziej komfortowo z programowaniem na niskim poziomie niż przy użyciu klasycznych narzędzi unixowych, które są dobre, jeśli robią dokładnie to, co chcesz, ale (myślę) są ogólnie mniej elastyczne.
To podejście (manipulowanie plikiem w pamięci) wymienia pamięć na miejsce na dysku. Powinien działać dobrze na komputerach z kilkoma GB pamięci dla plików do kilkuset Mb. Python nie radzi sobie bardzo dobrze z łańcuchami, więc na przykład przejście na C / C ++ nieznacznie zwiększy wydajność i znacznie zmniejszy użycie pamięci.
źródło
Możesz używać Vima w trybie Ex:
d
kasowaćx
Zapisz i zamknijźródło