Làm cách nào để đọc tệp nhị phân fortran trong python?

Chọn một trang web để nhận nội dung đã dịch nếu có và xem các sự kiện và ưu đãi tại địa phương. Dựa trên vị trí của bạn, chúng tôi khuyên bạn nên chọn.

Bạn cũng có thể chọn một trang web từ danh sách sau

Làm thế nào để có được hiệu suất trang web tốt nhất

Chọn trang Trung Quốc [bằng tiếng Trung hoặc tiếng Anh] để có hiệu suất trang tốt nhất. Các trang web quốc gia khác của MathWorks không được tối ưu hóa cho các lượt truy cập từ vị trí của bạn

Ferret có thể đọc các tệp dữ liệu nhị phân được định dạng có và không có tiêu đề độ dài bản ghi FORTRAN [các tệp nhị phân không có định dạng độ dài bản ghi FORTRAN còn được gọi là tệp "luồng"]

GHI CHÚ. Các loại tệp này không được hỗ trợ tích cực. Các khả năng trước đây có trong Ferret/PyFerret nhưng các loại tệp hiện đại hơn được khuyến khích vì tính độc lập của máy và tự ghi tài liệu

2. 4. 1 tệp nhị phân có cấu trúc FORTRAN

 

Các tệp chứa thông tin về độ dài bản ghi được tạo bởi các chương trình FORTRAN bằng cách sử dụng chế độ tạo tệp ACCESS="SEQUENTIAL" [mặc định của FORTRAN] và cả Ferret sử dụng LIST/FORMAT=unf. Các tệp chứa tiêu đề độ dài bản ghi FORTRAN phải có tất cả dữ liệu được căn chỉnh trên ranh giới 4 byte. Giả sử "rrrr" đại diện cho 4 byte thông tin độ dài bản ghi và "dddd" đại diện cho giá trị dữ liệu 4 byte. Sau đó, các tệp có cấu trúc FORTRAN được tổ chức theo một trong hai cách sau

 

2. 4. 1. 1 Bản ghi có độ dài đồng nhất

 

Tệp có cấu trúc FORTRAN với các bản ghi có độ dài đồng nhất [3 giá trị dữ liệu dấu phẩy động có độ chính xác đơn trên mỗi bản ghi trong hình này] trông như thế này

rrrr dddd dddd dddd rrrr ...

Mã FORTRAN tạo tệp dữ liệu thuộc loại này có thể trông giống như thế này [truy cập tuần tự là mặc định và không cần chỉ định trong câu lệnh MỞ]

REAL VARI[10], VAR2[10], VAR3[10]
...
OPEN[UNIT=20,FORMAT='UNFORMATTED',ACCESS='SEQUENTIAL',FILE='MYFILE.DAT']
...
DO 10 I=1,10
WRITE [20] VAR1[I], VAR2[I], VAR3[I]
10 CONTINUE
....

Để truy cập dữ liệu từ tệp này, hãy sử dụng

yes? SET DATA/EZ/FORMAT=UNF/VAR=var1,var2,var3/COL=3 myfile.dat or,
yes? FILE/FORMAT=UNF/VAR=var1,var2,var3/COLUMNS=3 myfile.dat

Điều này rất giống với việc truy cập dữ liệu ASCII với việc bổ sung bộ định tính /FORMAT=unf. Vòng loại /COLUMNS= cho Ferret biết số lượng giá trị dữ liệu trên mỗi bản ghi. Mặc dù là tùy chọn trong ví dụ trên, vòng loại này là bắt buộc nếu số lượng giá trị dữ liệu trên mỗi bản ghi lớn hơn số lượng biến được đọc [các ví dụ sau trong phần "Dữ liệu ASCII"]

 

2. 4. 1. 2 Hồ sơ có độ dài không đồng đều

 

Tệp có cấu trúc FORTRAN với các bản ghi có độ dài thay đổi có thể trông như thế này

rrrr dddd dddd rrrr
rrrr dddd rrrr
rrrr dddd dddd dddd dddd rrrr
etc.

Cẩn thận, có thể đọc tệp dữ liệu chứa các bản ghi có độ dài thay đổi được tạo bằng cách sử dụng câu lệnh FORTRAN OPEN không định dạng đơn giản nhất và một câu lệnh WRITE cho mỗi biến. Sử dụng /FORMAT=stream để đọc các tệp như vậy. Lưu ý rằng truy cập tuần tự là mặc định của FORTRAN và không cần chỉ định trong câu lệnh OPEN

REAL VAR1[1000], VAR2[500]
...
OPEN [UNIT=20, FORMAT="UNFORMATTED", FILE="MYFILE.DAT"]
...
WRITE [20] VAR1
WRITE [20] VAR2
....

Sử dụng từ hạn định /SKIP để bỏ qua thông tin về độ dài bản ghi [đối số /SKIP theo đơn vị từ 8 byte] và xác định một lưới sẽ không đọc qua các giá trị dữ liệu. Vòng loại /COLUMNS= có thể được sử dụng khi đọc nhiều biến để chỉ định số lượng từ ngăn cách phần đầu của mỗi biến

yes? DEFINE AXIS/X=1:500:1 xaxis
yes? DEFINE GRID/X=XAXIS mygrid
yes? FILE/FORMAT=stream/SKIP=1003/GRID=mygrid/VAR=var2 myfile.dat

Đối số 1003 là tổng của 1000 từ dữ liệu trong bản ghi 1, cộng với 2 từ thông tin độ dài bản ghi xung quanh các giá trị dữ liệu trong bản ghi 1 [biến var1], cộng với 1 từ thông tin bản ghi trước dữ liệu trong bản ghi 2

Khi đọc từ luồng hoặc tệp nhị phân, toàn bộ lưới được đọc khi dữ liệu được yêu cầu. Để đọc các tập hợp con của dữ liệu, có thể xác định một lưới nhỏ hơn để đọc một tập hợp con các bản ghi và có thể ghi nó ra tệp netCDF, thực hiện lần đọc thứ hai, bỏ qua các bản ghi đầu tiên đó, v.v.

2. 4. 1. 3 tệp nhị phân Fortran, các biến trên các lưới khác nhau

Một số tệp có cấu trúc FORTRAN có nhiều biến trên mỗi bản ghi không chia sẻ lưới chung. Một ví dụ sẽ là một năm của trường hàng tháng toàn cầu được lưu trữ dưới dạng mười hai bản ghi như thế này

rrrr year month field[360x180] rrrr

Kích thước tệp dữ liệu là [1+1+1+360*180+1]*12*4 = 3110592 byte. Không thể đọc một tệp như vậy với bộ định tính /FORMAT=unf nhưng có thể đọc được với bộ định tính /FORMAT=stream được mô tả trong phần tiếp theo. Bằng cách bao gồm bộ định tính /SWAP, kỹ thuật này có thể được sử dụng để đọc các tệp được tạo trên máy có thứ tự byte khác

Các lệnh sau sẽ đọc tệp này và gán dữ liệu cho lưới thích hợp

yes? ! Create an X axis for an entire record.
yes? DEFINE AXIS/X=1:`3+360*180+1`:1 binary_x
yes? DEFINE AXIS/T=1:12:1 binary_t
yes? DEFINE GRID/X=binary_x/T=binary_t binary_g

yes? ! Read in everything.
yes? FILE/FORMAT=stream/G=binary_g/VAR=val binary_file

! Create the grid for the data field.
yes? DEFINE AXIS/MODULO/X=0.5:359.5:1 1deg_x
yes? DEFINE AXIS/Y=-89.5:89.5:1 1deg_y
yes? DEFINE AXIS/T=15-jan-1999:15-dec-1999:1/UNITS=month month_1999_t
yes? DEFINE GRID/X=1deg_x/Y=1deg_y/T=month_1999_t 1deg_1999_g

yes? ! Create a variable that uses this grid.
yes? LET dummy = x[GX=R_1deg_1999_g] + y[GY=R_1deg_1999_g] + t[GT=R_1deg_1999_g]

yes? ! Reshape the data portion of val onto the data grid.
yes? LET field = RESHAPE[val[i=4:`3+360*180`],dummy]

 

2. 4. 2 Dòng tệp nhị phân

Các tệp không có thông tin độ dài bản ghi nhúng được tạo bởi các chương trình FORTRAN bằng cách sử dụng ACCESS="DIRECT" trong các câu lệnh OPEN và bởi các chương trình C sử dụng thư viện C studio. Các tệp này có thể chứa hỗn hợp số nguyên và số thực. Các loại sau đây có thể được đọc từ một tệp không có cấu trúc

FORTRAN

C

Kích thước tính bằng byte

   

SỐ NGUYÊN*1

than

1

SỐ SỐ*2

ngắn ngủi

2

SỐ SỐ*4

int

4

THỰC*4

trôi nổi

4

THỰC*8

gấp đôi

8

 

2. 4. 2. 1 Tệp luồng đơn giản

Giả sử "dddd" đại diện cho giá trị dữ liệu 4 byte. Sau đó, tệp nhị phân luồng [hoặc "truy cập trực tiếp"] của FORTRAN REAL*4 hoặc C float là

________số 8

Cấu trúc của các bản ghi được ngụ ý bởi chương trình truy cập dữ liệu. Mã FORTRAN tạo tệp nhị phân truy cập trực tiếp có thể trông như thế này

REAL*4 MYVAR[10,5]
...
C Use RECL=40 for machines that specify in bytes

OPEN[UNIT=20, FILE="myfile.dat", ACCESS="DIRECT", RECL=10]
...
DO 100 j = 1, 5
100 WRITE [20,REC=j] [MYVAR[i,j],i=1,10]
....

Sử dụng các lệnh Ferret sau để đọc biến "myvar" từ tệp này

REAL VARI[10], VAR2[10], VAR3[10]
...
OPEN[UNIT=20,FORMAT='UNFORMATTED',ACCESS='SEQUENTIAL',FILE='MYFILE.DAT']
...
DO 10 I=1,10
WRITE [20] VAR1[I], VAR2[I], VAR3[I]
10 CONTINUE
....
0

Nếu tệp bao gồm một bộ FORTRAN REAL*8 hoặc C nhân đôi, thì

và các lệnh Ferret sau sẽ đọc dữ liệu vào "myvar"

REAL VARI[10], VAR2[10], VAR3[10]
...
OPEN[UNIT=20,FORMAT='UNFORMATTED',ACCESS='SEQUENTIAL',FILE='MYFILE.DAT']
...
DO 10 I=1,10
WRITE [20] VAR1[I], VAR2[I], VAR3[I]
10 CONTINUE
....
1

Lưu ý việc bổ sung từ hạn định "type". Xem SET DATA/FORMAT=stream để biết thêm chi tiết

Khi đọc từ luồng hoặc tệp nhị phân, toàn bộ lưới được đọc khi dữ liệu được yêu cầu. Để đọc các tập hợp con của dữ liệu, hãy xác định một lưới nhỏ hơn để đọc một tập hợp con các bản ghi và có thể ghi nó ra tệp netCDF, thực hiện lần đọc thứ hai, bỏ qua các bản ghi đầu tiên đó, v.v.

Vì Ferret đại diện cho tất cả các biến là REAL*8, nên nó sẽ đọc tất cả dữ liệu trong các từ 8 byte. Khi ghi dữ liệu bằng lệnh LIST/FORMAT=stream, theo mặc định, nó ghi dữ liệu bằng các từ 8 byte

Bắt đầu với Ferret v7. 45, từ hạn định /OUTTYPE có thể được sử dụng với LIST/FORMAT=stream.  

 

2. 4. 2. 2 tệp luồng hỗn hợp

 

Ferret có thể đọc các tệp nhị phân chứa hỗn hợp các số thuộc loại khác nhau. Tuy nhiên, một biến Ferret nhất định chỉ có thể là một loại. Giả sử bạn có một tệp chứa hỗn hợp các số REAL*8 và REAL*4

Sau đây sẽ đọc thành công tập tin

REAL VARI[10], VAR2[10], VAR3[10]
...
OPEN[UNIT=20,FORMAT='UNFORMATTED',ACCESS='SEQUENTIAL',FILE='MYFILE.DAT']
...
DO 10 I=1,10
WRITE [20] VAR1[I], VAR2[I], VAR3[I]
10 CONTINUE
....
2

trong khi

REAL VARI[10], VAR2[10], VAR3[10]
...
OPEN[UNIT=20,FORMAT='UNFORMATTED',ACCESS='SEQUENTIAL',FILE='MYFILE.DAT']
...
DO 10 I=1,10
WRITE [20] VAR1[I], VAR2[I], VAR3[I]
10 CONTINUE
....
3

Sẽ thất bại

2. 4. 2. 3 tệp luồng được hoán đổi byte

Có thể đọc các tệp truyền phát có số được hoán đổi byte bằng vòng loại /SWAP. Lưu ý rằng các từ hạn định /ORDER và /SKIP cũng có sẵn [xem chương "Thông tin cơ bản về tập dữ liệu", phần "Đọc tệp ASCII", để biết thêm chi tiết về /ORDER và /SKIP]

Chúng ta có thể đọc tệp nhị phân bằng Python không?

Để đọc từ tệp nhị phân, chúng ta cần mở tệp đó bằng chế độ rb thay vì chế độ mặc định là rt . >>> với open["bài tập. zip", mode="rb"] dưới dạng zip_file. . nội dung = zip_file. đọc[].

Làm cách nào để đọc tệp nhị phân?

Để đọc từ tệp nhị phân .
Sử dụng phương thức ReadAllBytes, trả về nội dung của tệp dưới dạng mảng byte. Ví dụ này đọc từ tệp C. /Documents and Settings/selfportrait. .
Đối với các tệp nhị phân lớn, bạn có thể sử dụng phương thức Đọc của đối tượng FileStream để chỉ đọc từ tệp một lượng được chỉ định tại một thời điểm

Dữ liệu được lưu trữ trong tệp nhị phân trong Python như thế nào?

kết xuất[]. Phương thức được sử dụng để ghi dữ liệu vào tệp nhị phân là phương thức kết xuất[] . Nó nhận hai đối số 'đối tượng tệp' và 'tệp' làm tham số. Nó trả về biểu diễn đối tượng ở chế độ byte. Phương thức dump[] thuộc về mô-đun dưa chua.

Fortran có phải là nhị phân không?

Sự khác biệt này là do Tệp nhị phân kiểu Fortran có tiêu đề và chân trang 4 byte xung quanh mỗi "bản ghi" trong tệp . Các đầu trang/cuối trang này mô tả kích thước của dữ liệu chứa trong bản ghi. [Trong trường hợp phổ biến nhất, mỗi tệp nhị phân bạn gặp sẽ chỉ có một bản ghi. ]

Chủ Đề