Hướng dẫn python read fortran formatted file - python đọc tệp được định dạng fortran

5

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi phải đọc một tệp dữ liệu có chứa các số được định dạng với kiểu Fortran cũ (rất). Một dòng của tệp trông như thế này:

 4.500000+1 1.894719-3 4.600000+1 8.196721-3 4.700000+1 2.869539-3

Tệp (hoặc phần lớn của nó) chứa các số này ở định dạng chiều rộng cố định. Vấn đề với việc đọc những con số này trong Python là không có

>>> float('4.50000+1')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for float(): 4.50000+1
1 trong các số này. Xem những gì xảy ra:

>>> float('4.50000+1')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for float(): 4.50000+1

Tôi có thể viết một trình phân tích cú pháp để đọc điều này, nhưng muốn biết nếu điều này đã được thực hiện. Đây là một định dạng Fortran cũ vì vậy tôi nghĩ có lẽ ai đó đã tìm ra nó. Có ai biết về một thư viện để đọc các số như thế này không?

Đã hỏi ngày 7 tháng 11 năm 2012 lúc 16:34Nov 7, 2012 at 16:34

Hướng dẫn python read fortran formatted file - python đọc tệp được định dạng fortran

2

Bạn có thể sử dụng thư viện định dạng Fortran cho Python như sau,

>>> import fortranformat as ff
>>> reader = ff.FortranRecordReader('(6F13.7)')
>>> reader.read(' 4.500000+1 1.894719-3 4.600000+1 8.196721-3 4.700000+1 2.869539-3')
[45.0, 0.001894719, 46.0, 0.008196721, 47.0, 0.002869539]

Thư viện này đã được thử nghiệm rộng rãi trình biên dịch IFORT 9.1 của Aginst Intel để phù hợp với chính xác một số IO Textual Weirder Fortran.

Cài đặt bằng cách sử dụng

pip install fortranformat

Tôi nên tuyên bố một sự thiên vị kể từ khi tôi viết thư viện này ...

Đã trả lời ngày 25 tháng 11 năm 2012 lúc 14:33Nov 25, 2012 at 14:33

BrendanbrendanBrendan

18.4K17 Huy hiệu vàng81 Huy hiệu bạc108 Huy hiệu đồng17 gold badges81 silver badges108 bronze badges

1

Bạn có thể sử dụng một biểu thức thông thường để chèn "E" trước khi chuyển các số sang

>>> float('4.50000+1')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for float(): 4.50000+1
2.

re.sub(r'(\d)([-+])', r'\1E\2', number)

Đã trả lời ngày 7 tháng 11 năm 2012 lúc 16:40Nov 7, 2012 at 16:40

Jamey Sharpjamey SharpJamey Sharp

8.2432 Huy hiệu vàng28 Huy hiệu bạc42 Huy hiệu đồng2 gold badges28 silver badges42 bronze badges

Điều này sẽ hoạt động:

In [47]: strs="4.500000+1 1.894719-3 4.600000+1 8.196721-3 4.700000+1 2.869539-3"

In [48]: [float(x.replace("+","e+").replace("-","e-")) for x in strs.split()]

Out[48]: [45.0, 0.001894719, 46.0, 0.008196721, 47.0, 0.002869539]

Đã trả lời ngày 7 tháng 11 năm 2012 lúc 16:42Nov 7, 2012 at 16:42

Hướng dẫn python read fortran formatted file - python đọc tệp được định dạng fortran

Ashwini Chaudharyashwini ChaudharyAshwini Chaudhary

237K56 Huy hiệu vàng448 Huy hiệu bạc497 Huy hiệu đồng56 gold badges448 silver badges497 bronze badges

5

Một cách tiếp cận khác là sử dụng lệnh hệ thống để truy cập AWK:

Lưu ý việc thoát khỏi "ký tự bên trong

>>> float('4.50000+1')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for float(): 4.50000+1
3

import subprocess
COMMAND = "awk 'gsub(/D/,\"E\");{print}' epsc8.out > epsc8E.out"
subprocess.call(COMMAND, shell=True)

Hướng dẫn python read fortran formatted file - python đọc tệp được định dạng fortran

Stephen Rauch ♦

45,9k30 huy hiệu vàng106 Huy hiệu bạc126 Huy hiệu đồng30 gold badges106 silver badges126 bronze badges

Đã trả lời ngày 19 tháng 5 năm 2018 lúc 0:01May 19, 2018 at 0:01

classScipy.io.forTranfile (tên tệp, mode = 'r', header_dtype =) [nguồn]#scipy.io.FortranFile(filename, mode='r', header_dtype= 'numpy.uint32'>)[source]#

Một đối tượng tệp cho các tệp tuần tự không được định dạng từ mã Fortran.

Tham sốFileNameFile hoặc strfilenamefile or str

Mở đối tượng tệp hoặc tên tệp.

Chế độ {‘R,‘ W,}, Tùy chọn{‘r’, ‘w’}, optional

Chế độ đọc-viết, mặc định là ‘r.

header_dtypedType, tùy chọndtype, optional

Kiểu dữ liệu của tiêu đề. Kích thước và độ cuối phải phù hợp với tệp đầu vào/đầu ra.

Ghi chú

Các tệp này được chia thành các bản ghi của các loại không xác định. Kích thước của mỗi bản ghi được đưa ra khi bắt đầu (mặc dù kích thước của tiêu đề này không phải là tiêu chuẩn) và dữ liệu được ghi vào đĩa mà không có bất kỳ định dạng nào. Các trình biên dịch Fortran hỗ trợ câu lệnh Backspace sẽ viết một bản sao thứ hai có kích thước để tạo điều kiện tìm kiếm ngược.

Lớp này chỉ hỗ trợ các tệp được viết với cả hai kích thước cho bản ghi. Nó cũng không hỗ trợ các subrecord được sử dụng trong các trình biên dịch Intel và GFORTRAN cho các bản ghi lớn hơn 2GB với tiêu đề 4 byte.

Một ví dụ về một tệp tuần tự không được định dạng trong Fortran sẽ được viết là:

OPEN(1, FILE=myfilename, FORM='unformatted')

WRITE(1) myvariable

Vì đây là định dạng tệp không chuẩn, có nội dung phụ thuộc vào trình biên dịch và tính nội dung của máy, nên thận trọng. Các tệp từ GFORTRAN 4.8.0 và GFORTRAN 4.1.2 trên x86_64 được biết là hoạt động.

Xem xét sử dụng các tệp hoặc tệp truy cập trực tiếp Fortran từ luồng I/O mới hơn, có thể dễ dàng đọc bởi

>>> float('4.50000+1')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for float(): 4.50000+1
4.

Ví dụ

Để tạo một tệp Fortran tuần tự không được định dạng:

>>> from scipy.io import FortranFile
>>> f = FortranFile('test.unf', 'w')
>>> f.write_record(np.array([1,2,3,4,5], dtype=np.int32))
>>> f.write_record(np.linspace(0,1,20).reshape((5,4)).T)
>>> f.close()

Để đọc tệp này:

>>> f = FortranFile('test.unf', 'r')
>>> print(f.read_ints(np.int32))
[1 2 3 4 5]
>>> print(f.read_reals(float).reshape((5,4), order="F"))
[[0.         0.05263158 0.10526316 0.15789474]
 [0.21052632 0.26315789 0.31578947 0.36842105]
 [0.42105263 0.47368421 0.52631579 0.57894737]
 [0.63157895 0.68421053 0.73684211 0.78947368]
 [0.84210526 0.89473684 0.94736842 1.        ]]
>>> f.close()

Hoặc, trong Fortran:

>>> float('4.50000+1')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for float(): 4.50000+1
0

Phương pháp

>>> float('4.50000+1')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for float(): 4.50000+1
5()

Đóng tệp.

>>> float('4.50000+1')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for float(): 4.50000+1
6([dtype])

Đọc một bản ghi của một loại đã cho từ tệp, mặc định sang loại số nguyên (

>>> float('4.50000+1')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for float(): 4.50000+1
7 trong Fortran).

>>> float('4.50000+1')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for float(): 4.50000+1
8([dtype])

Đọc một bản ghi của một loại đã cho từ tệp, mặc định đến số điểm nổi (

>>> float('4.50000+1')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for float(): 4.50000+1
9 trong Fortran).

>>> import fortranformat as ff
>>> reader = ff.FortranRecordReader('(6F13.7)')
>>> reader.read(' 4.500000+1 1.894719-3 4.600000+1 8.196721-3 4.700000+1 2.869539-3')
[45.0, 0.001894719, 46.0, 0.008196721, 47.0, 0.002869539]
0(*dtypes, **kwargs)

Đọc một bản ghi của một loại nhất định từ tệp.

>>> import fortranformat as ff
>>> reader = ff.FortranRecordReader('(6F13.7)')
>>> reader.read(' 4.500000+1 1.894719-3 4.600000+1 8.196721-3 4.700000+1 2.869539-3')
[45.0, 0.001894719, 46.0, 0.008196721, 47.0, 0.002869539]
1(*items)

Viết một bản ghi (bao gồm các kích thước) vào tệp.