Szczególnie trudno jest mi odczytać plik binarny w Pythonie. Czy może Pan mi pomóc? Muszę przeczytać ten plik, który w Fortranie 90 łatwo czyta
int*4 n_particles, n_groups
real*4 group_id(n_particles)
read (*) n_particles, n_groups
read (*) (group_id(j),j=1,n_particles)
Dokładniej mówiąc, format pliku to:
Bytes 1-4 -- The integer 8.
Bytes 5-8 -- The number of particles, N.
Bytes 9-12 -- The number of groups.
Bytes 13-16 -- The integer 8.
Bytes 17-20 -- The integer 4*N.
Next many bytes -- The group ID numbers for all the particles.
Last 4 bytes -- The integer 4*N.
Jak mogę to przeczytać w Pythonie? Próbowałem wszystkiego, ale nigdy nie działało. Czy jest szansa, że mógłbym użyć programu F90 w Pythonie, odczytać ten plik binarny, a następnie zapisać dane, których potrzebuję?
fromfile
Funkcja Numpy ułatwia odczytywanie plików binarnych. Polecam to.Odpowiedzi:
Przeczytaj zawartość pliku binarnego w ten sposób:
następnie „rozpakuj” dane binarne za pomocą struct.unpack :
Bajty początkowe:
struct.unpack("iiiii", fileContent[:20])
Treść: zignoruj bajty nagłówka i bajt końcowy (= 24); Pozostała część tworzy treść, aby poznać liczbę bajtów w treści, wykonaj podział całkowity przez 4; Otrzymany iloraz jest mnożony przez ciąg znaków,
'i'
aby utworzyć poprawny format dla metody rozpakowywania:Bajt końcowy:
struct.unpack("i", fileContent[-4:])
źródło
import struct
Ogólnie polecam przyjrzenie się do tego celu wykorzystania modułu struct w Pythonie . Jest to standard w Pythonie i powinno być łatwe do przetłumaczenia specyfikacji twojego pytania na ciąg formatujący odpowiedni dla
struct.unpack()
.Zwróć uwagę, że jeśli istnieje „niewidoczne” wypełnienie między polami / wokół nich, będziesz musiał to rozgryźć i uwzględnić w
unpack()
wywołaniu, w przeciwnym razie odczytasz niewłaściwe bity.Odczytanie zawartości pliku w celu wypakowania czegoś jest dość trywialne:
Spowoduje to rozpakowanie dwóch pierwszych pól, zakładając, że zaczynają się na samym początku pliku (bez wypełniania lub zbędnych danych), a także przy założeniu natywnej kolejności bajtów (
@
symbol). WI
s w ciągu formatowania oznacza „liczbę całkowitą bez znaku, 32 bitów”.źródło
Możesz użyć
numpy.fromfile
, który może czytać dane zarówno z plików tekstowych, jak i binarnych. Najpierw należy skonstruować typ danych, który reprezentuje format pliku, używającnumpy.dtype
, a następnie odczytać ten typ z pliku za pomocąnumpy.fromfile
.źródło
Aby odczytać plik binarny z
bytes
obiektu:Aby utworzyć
int
z bajtów 0-3 danych:Aby rozpakować wiele plików
int
z danych:pathlib
int.from_bytes()
struct
źródło
Mnie też brakuje Pythona, jeśli chodzi o czytanie i pisanie plików binarnych, więc napisałem mały moduł (dla Pythona 3.6+).
Z plikiem binarnym zrobiłbyś coś takiego (zgaduję, skoro nie znam Fortrana):
Który daje taki wynik:
Użyłem skip (), aby pominąć dodatkowe dane, które dodaje Fortran, ale zamiast tego możesz dodać narzędzie do poprawnej obsługi rekordów Fortran. Jeśli to zrobisz, żądanie ściągnięcia byłoby mile widziane.
źródło
źródło
pickle.load
ładuje? Czy ładuje strumień Fortran, pliki bezpośrednie czy sekwencyjne? Są różne i nie są kompatybilne.