Piszę skrypt do przetwarzania plików XI EDI, które chciałbym iterować wiersz po wierszu. Pliki składają się z sekwencji odrębnych rekordów, z których każdy zakończony jest specjalnym znakiem (np. ~
, ale patrz poniżej). Pliki mogą być duże (> 100 MB), więc nie chcę czytać całej rzeczy i dzielić ją. Rekordy nie są rozdzielane przez znaki nowej linii; czytanie w pierwszej linii prawdopodobnie odczytałoby cały plik. Pliki są w całości ASCII.Czytaj plik do postaci
Python wyraźnie zapewnia odczyt pliku do określonej postaci, pod warunkiem, że jest to znak nowej linii. Chciałbym zrobić to samo z arbitralnym charakterem. Zakładam, że czytanie po linii jest realizowane poprzez buforowanie. Mogłabym wdrożyć mój własny buforowany czytnik, ale wolałbym uniknąć dodatkowego kodu i kosztów ogólnych, jeśli istnieje lepsze rozwiązanie.
Uwaga: Widziałem kilka podobnych pytań, ale wszystkie zdawały się wskazywać, że należy czytać plik w wierszu, zakładając, że linie będą miały rozsądny rozmiar. W tym przypadku cały plik będzie prawdopodobnie jedną linią.
Edytuj: Znak końca segmentu jest równy 106 bajtowi pliku. Nie wiadomo, zanim skrypt zostanie wywołany.
Może użyć '.read (some_reasonable_number)' na wskaźniku pliku i przeszukać wynik dopóki nie znajdziesz swojego '~', a jeśli to zrobisz, '.seek()' do tyłu? – L3viathan
Wierzę, że masz rację co do buforowanego czytnika, a niestety argument 'newline' w' open' nie zezwala na '~'. –
Obawiam się, że będziesz musiał napisać dedykowaną implementację przez io.BytesIO, czytając plik w kawałkach i wysyłając * linię * zakończoną określonym ogranicznikiem ... –