có thể ghi các bảng ASCII ra một tệp hoặc đối tượng giống như tệp bằng cách sử dụng cùng cấu trúc lớp và giao diện người dùng cơ bản như để đọc bảng
Hàm cung cấp cách ghi bảng dữ liệu dưới dạng bảng ASCII đã định dạng
ví dụ
Để viết bảng ASCII được định dạng bằng hàm
>>> import numpy as np >>> from astropy.io import ascii >>> from astropy.table import Table >>> data = Table() >>> data['x'] = np.array([1, 2, 3], dtype=np.int32) >>> data['y'] = data['x'] ** 2 >>> ascii.write(data, 'values.dat', overwrite=True)
Tệp x y 1 1 2 4 3 9 9 sau đó sẽ chứa
x y 1 1 2 4 3 9
Cũng có thể và được khuyến khích sử dụng chức năng ghi từ giao diện cấp cao hơn trong gói (xem để biết thêm chi tiết). Ví dụ
>>> data.write('values.dat', format='ascii', overwrite=True)
Để có phiên bản ASCII dễ tái sản xuất hơn cho bảng của bạn, chúng tôi khuyên bạn nên sử dụng. Điều này lưu trữ tất cả siêu dữ liệu của bảng (đặc biệt là các loại và đơn vị cột) vào phần nhận xét ngay từ đầu trong khi vẫn duy trì khả năng tương thích với hầu hết các trình đọc CSV đơn giản. Nó cũng cho phép lưu trữ dữ liệu phong phú hơn như các cột đa chiều hoặc có độ dài thay đổi. Đối với ví dụ đơn giản của chúng tôi
>>> data.write('values.ecsv', overwrite=True)
Phần mở rộng >>> data.write('values.dat', format='ascii', overwrite=True) 2 được công nhận và ngụ ý sử dụng ECSV (tương đương với >>> data.write('values.dat', format='ascii', overwrite=True) 3). Tệp >>> data.write('values.dat', format='ascii', overwrite=True) 4 sau đó sẽ chứa
________số 8
Hầu hết các bảng đầu vào để đọc cũng có sẵn để viết. Điều này cung cấp rất nhiều tính linh hoạt trong định dạng để viết. Ví dụ bên dưới ghi dữ liệu dưới dạng bảng LaTeX, sử dụng tùy chọn gửi đầu ra tới >>> data.write('values.dat', format='ascii', overwrite=True) 5 thay vì tệp
x y 1 1 2 4 3 9 0
Ngoài ra còn có một công cụ Cython nhanh hơn để viết các định dạng đơn giản, được bật theo mặc định cho các định dạng này (xem tài liệu tham khảo). Để tắt công cụ này, hãy sử dụng tham số >>> data.write('values.dat', format='ascii', overwrite=True) 6
x y 1 1 2 4 3 9 2
Ghi chú
Đối với hầu hết các định dạng được hỗ trợ, người ta có thể viết một bảng bị che và sau đó đọc lại mà không làm mất thông tin về các mục trong bảng bị che. Điều này được thực hiện bằng cách sử dụng một mục nhập chuỗi trống để biểu thị giá trị bị che (thiếu). Xem phần để biết thêm thông tin
Tham số cho x y 1 1 2 4 3 9 7
Hàm nhận một số tham số quy định định dạng bảng kết xuất chi tiết. Mỗi loại được xử lý bởi một lớp Writer tương ứng có thể xác định các giá trị mặc định khác nhau, do đó, các mô tả bên dưới đôi khi đề cập đến các giá trị mặc định “điển hình”. Điều này đề cập đến người viết và các lớp Nhà văn tương tự khác
Một số lớp Writer định dạng đầu ra (e. g. hoặc ) chấp nhận các từ khóa bổ sung có thể tùy chỉnh thêm đầu ra. Xem tài liệu của các lớp này để biết chi tiết
đầu ra. đầu ra specifierCó hai cách để chỉ định đầu ra cho thao tác ghi
Tên của một tập tin (chuỗi)
Đối tượng giống như tệp (từ open(), StringIO, v.v. )
Bất kỳ giá trị nào được hỗ trợ để khởi tạo một đối tượng (xem ). Điều này bao gồm một bảng có danh sách các cột, từ điển các cột hoặc từ các mảng (có cấu trúc hoặc đồng nhất)
định dạng. định dạng đầu ra (mặc định=’cơ bản’)Điều này chỉ định định dạng của bảng ASCII sẽ được ghi, chẳng hạn như bảng được phân tách bằng ký tự cơ bản, bảng có định dạng cố định hoặc bảng tương thích với CD, v.v. Giá trị của tham số này phải là một trong các
dấu phân cách. chuỗi phân cách cộtChuỗi một ký tự được sử dụng để phân tách các trường thường mặc định là ký tự khoảng trắng. Các giá trị phổ biến khác có thể là “,” hoặc “. ” hoặc “\t”
bình luận. chuỗi xác định bắt đầu dòng nhận xét trong bảng đầu raĐối với Nhà văn, giá trị này mặc định là “#“. Bình luận nào được viết và như thế nào tùy thuộc vào định dạng đã chọn. Các nhận xét được định nghĩa là một danh sách các chuỗi trong phần tử >>> data.write('values.ecsv', overwrite=True) 5 của bảng đầu vào. Nhận xét trong siêu dữ liệu của nội dung đã cho thường sẽ được viết trước tiêu đề, mặc dù viết nhận xét bảng sau tiêu đề nhận xét. Để tắt viết bình luận, hãy đặt >>> data.write('values.ecsv', overwrite=True) 8
định dạng. dict của bộ chuyển đổi kiểu dữ liệuĐối với mỗi khóa (tên cột), hãy sử dụng giá trị đã cho để chuyển đổi dữ liệu cột thành chuỗi. Nếu giá trị định dạng giống như chuỗi, thì nó được sử dụng như một câu lệnh định dạng Python (e. g. , '%0. 2f’ % giá trị). Nếu đó là một hàm có thể gọi được, thì hàm đó được gọi với một đối số duy nhất chứa giá trị cột sẽ được chuyển đổi. Thí dụ
x y 1 1 2 4 3 9 6
tên. danh sách tên cột đầu raXác định danh sách đầy đủ các tên cột đầu ra để ghi cho bảng dữ liệu, ghi đè các tên cột hiện có
bao gồm_names. danh sách các tên để đưa vào đầu raTừ danh sách các tên cột được tìm thấy từ bảng dữ liệu hoặc tham số >>> data.write('values.ecsv', overwrite=True) 9, chọn chỉ xuất các cột trong danh sách này. Nếu không được cung cấp thì bao gồm tất cả các tên
loại trừ_names. danh sách các tên để loại trừ khỏi đầu raLoại trừ những tên này khỏi danh sách các cột đầu ra. Điều này được áp dụng sau khi lọc # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 0. Nếu không được chỉ định thì không có cột nào bị loại trừ
fill_values. danh sách các chỉ định giá trị điềnĐiều này có thể được sử dụng để điền vào các giá trị còn thiếu trong bảng hoặc thay thế các giá trị có ý nghĩa đặc biệt
Xem phần để biết thêm thông tin về cú pháp. Cú pháp gần giống như khi đọc bảng. Có một giá trị đặc biệt # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 1 được sử dụng để nói “xuất chuỗi này cho tất cả các giá trị được che dấu trong một bảng được che dấu” (mặc định là sử dụng chuỗi rỗng # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 2)
x y 1 1 2 4 3 9 1
Lưu ý rằng khi viết bảng, tất cả các giá trị được chuyển đổi thành chuỗi trước khi bất kỳ giá trị nào được thay thế. Vì # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 3 chỉ thay thế các ô khớp chính xác với thông số kỹ thuật nên bạn cần cung cấp biểu diễn chuỗi (đã loại bỏ khoảng trắng) cho từng giá trị. Ví dụ, trong các lệnh sau, # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 4 được định dạng bằng hai chữ số sau dấu phẩy, vì vậy chúng ta cần thay thế # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 5 chứ không phải # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 4
x y 1 1 2 4 3 9 6
Tương tự, nếu bạn thay thế một giá trị trong cột có định dạng độ dài cố định (e. g. , # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 7) thì chuỗi bạn muốn thay thế phải có cùng số ký tự. Trong ví dụ trên, # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 8 sẽ hoạt động
fill_include_names. danh sách các tên cột, bị ảnh hưởng bởi # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 3Nếu không được cung cấp, thì # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 3 có thể ảnh hưởng đến tất cả các cột
fill_exclude_names. danh sách các tên cột, không bị ảnh hưởng bởi # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 3Nếu không được cung cấp, thì # %ECSV 1.0 # --- # datatype: # - {name: x, datatype: int32} # - {name: y, datatype: int32} # schema: astropy-2.0 x y 1 1 2 4 3 9 3 có thể ảnh hưởng đến tất cả các cột
fast_writer. có nên sử dụng trình viết Cython nhanh hay khôngNếu tham số này là x y 1 1 2 4 3 9 03 (theo mặc định), sẽ cố gắng sử dụng trình ghi nhanh hơn (được mô tả trong ) nếu có thể. Chỉ định x y 1 1 2 4 3 9 05 sẽ vô hiệu hóa hành vi này
Writer Writer class (không được dùng để ủng hộ x y 1 1 2 4 3 9 06)Điều này chỉ định định dạng cấp cao nhất của bảng ASCII sẽ được ghi, chẳng hạn như bảng được phân cách bằng ký tự cơ bản, bảng có định dạng cố định hoặc bảng tương thích với CDS, v.v. Giá trị của tham số này phải là một lớp Nhà văn. Đối với việc sử dụng cơ bản, điều này có nghĩa là một trong những cài đặt sẵn. Lưu ý rằng lớp Reader và lớp Writer là đồng nghĩa;
Định dạng bảng có thể đọc bằng máy
Định dạng Bảng có thể đọc bằng máy (MRT) của Tạp chí Hiệp hội Thiên văn Hoa Kỳ bao gồm một tệp duy nhất có tiêu đề mô tả bảng và chính dữ liệu của bảng. MRT tương tự như tiêu chuẩn định dạng CDS, nhưng khác ở phần mô tả bảng và thiếu tệp x y 1 1 2 4 3 9 07 riêng. Astropy không hỗ trợ ghi ở định dạng CDS
Người viết hỗ trợ viết bảng sang định dạng MRT
Ghi chú
Siêu dữ liệu của bảng, ngoài cột x y 1 1 2 4 3 9 09, x y 1 1 2 4 3 9 20 và x y 1 1 2 4 3 9 21, không được ghi trong tệp đầu ra. Phần giữ chỗ cho các trường tiêu đề, tác giả và tên bảng được đưa vào tệp đầu ra và có thể được chỉnh sửa sau khi viết
ví dụ
Lệnh x y 1 1 2 4 3 9 22 ghi một x y 1 1 2 4 3 9 23 sang định dạng MRT. Bộ chia phần x y 1 1 2 4 3 9 25 và x y 1 1 2 4 3 9 26 được sử dụng để chia bảng thành các phần khác nhau, với phần cuối cùng luôn là dữ liệu thực tế
Theo tiêu chuẩn MRT yêu cầu, đối với các cột có thuộc tính x y 1 1 2 4 3 9 09 không được đặt thành x y 1 1 2 4 3 9 03, tên đơn vị được lập bảng trong mô tả Byte-By-Byte của cột. Khi các cột không chứa bất kỳ đơn vị nào, thay vào đó, hãy đặt x y 1 1 2 4 3 9 25. Một x y 1 1 2 4 3 9 60 được thêm tiền tố vào phần mô tả cột trong Byte-By-Byte cho các cột x y 1 1 2 4 3 9 61 hoặc các cột có giá trị null, biểu thị chúng như vậy
Ví dụ bên dưới khởi tạo một bảng có các cột có thuộc tính x y 1 1 2 4 3 9 09 và có các giá trị ẩn
x y 1 1 2 4 3 9 0
Lưu ý rằng đối với các cột có và các giá trị liên quan, người viết không thực hiện bất kỳ chuyển đổi hoặc sửa đổi nội bộ nào. Các cột này phải được chuyển đổi thành các cột thông thường với thuộc tính x y 1 1 2 4 3 9 09 và x y 1 1 2 4 3 9 20 thích hợp trước khi viết bảng. Như vậy
x y 1 1 2 4 3 9 1
Các cột là đối tượng hoặc cột có giá trị là các đối tượng như vậy được nhận dạng như vậy và một số nhãn và mô tả được xác định trước được sử dụng cho chúng. Các cột tọa độ đã được chia nhỏ bổ sung thành các cột thành phần tọa độ của chúng. Các biểu diễn có các thành phần x y 1 1 2 4 3 9 69 và x y 1 1 2 4 3 9 10 được chia thành các thành phần x y 1 1 2 4 3 9 11-x y 1 1 2 4 3 9 12-x y 1 1 2 4 3 9 13 và x y 1 1 2 4 3 9 14-x y 1 1 2 4 3 9 15-x y 1 1 2 4 3 9 16 tương ứng. Trong khi các cột có các đối tượng >>> data.write('values.dat', format='ascii', overwrite=True) 1 trong x y 1 1 2 4 3 9 18 hoặc bất kỳ khung x y 1 1 2 4 3 9 19 nào chỉ được chia thành các thành phần vĩ độ (x y 1 1 2 4 3 9 60/x y 1 1 2 4 3 9 61) và kinh độ (x y 1 1 2 4 3 9 62/x y 1 1 2 4 3 9 61) của chúng. Bảng gốc vẫn có thể truy cập như vậy, trong khi tệp được ghi từ một bản sao đã sửa đổi của bảng. Các cột thành phần tọa độ mới được thêm vào cuối bảng
Cần lưu ý rằng độ chính xác mặc định của các cột vĩ độ, kinh độ và giây (của cung) được đặt ở số mặc định là 12, 10 và 9 chữ số sau dấu thập phân cho các giá trị x y 1 1 2 4 3 9 14, x y 1 1 2 4 3 9 13 và x y 1 1 2 4 3 9 16 tương ứng. Giá trị mặc định này được đặt để khớp với độ chính xác của máy là 1e-15 so với >>> data.write('values.dat', format='ascii', overwrite=True) 1 ban đầu, các cột đó được trích xuất từ. Như tất cả các cột khác, định dạng có thể được thiết lập rõ ràng bằng cách chuyển từ khóa x y 1 1 2 4 3 9 68 đến hàm x y 1 1 2 4 3 9 69 hoặc bằng cách đặt thuộc tính x y 1 1 2 4 3 9 06 của các cột riêng lẻ (cái sau sẽ chỉ hoạt động đối với các cột không được phân tách). Để tùy chỉnh số chữ số có nghĩa, do đó, các dự đoán phải được chỉ định trong từ điển x y 1 1 2 4 3 9 68 cho các tên cột đầu ra, chẳng hạn như x y 1 1 2 4 3 9 02 hoặc x y 1 1 2 4 3 9 03 để có độ chính xác mili giây. Lưu ý rằng các biểu mẫu có số 0 đứng đầu trong giây và bao gồm ký hiệu cho vĩ độ được khuyến nghị để có tính nhất quán và dễ đọc hơn
Đoạn mã sau minh họa điều trên
x y 1 1 2 4 3 9 2
Sau khi thực hiện, nội dung của x y 1 1 2 4 3 9 04 sẽ là
x y 1 1 2 4 3 9 3
Và tệp x y 1 1 2 4 3 9 05 sẽ trông giống như
x y 1 1 2 4 3 9 4
Cuối cùng, MRT có một số quy ước đặt tên cụ thể cho các cột (). Ví dụ: nếu một cột chứa lỗi trung bình cho dữ liệu trong cột có tên là x y 1 1 2 4 3 9 06, thì cột này phải được đặt tên là x y 1 1 2 4 3 9 07. Người viết MRT không thể thực thi các kiểu đặt tên cột tương đối này vì nó không biết ý nghĩa của dữ liệu cột và do đó, không thể tìm ra mối quan hệ giữa các cột. Do đó, tùy thuộc vào người dùng sử dụng x y 1 1 2 4 3 9 08 để đổi tên bất kỳ cột nào một cách thích hợp trước khi ghi bảng sang định dạng MRT. Ví dụ sau đây cho thấy tình huống tương tự, sử dụng tùy chọn gửi đầu ra tới >>> data.write('values.dat', format='ascii', overwrite=True) 5 thay vì tệp
x y 1 1 2 4 3 9 5
Chú ý
Trình ghi MRT hiện hỗ trợ ghi tự động một cột tọa độ trong x y 1 1 2 4 3 9 10. Đối với các bảng có nhiều cột tọa độ của một loại đã cho. g. xích đạo, thiên hà hoặc hoàng đạo), chỉ cột tọa độ được tìm thấy đầu tiên sẽ được phân tách thành các cột thành phần của nó và phần còn lại của các cột tọa độ cùng loại sẽ được chuyển đổi thành cột chuỗi. Do đó, người dùng nên lưu ý rằng các cột tọa độ bổ sung được xử lý (e. g. bằng cách chuyển đổi chúng thành các cột có giá trị x y 1 1 2 4 3 9 11 duy nhất) trước khi sử dụng các phương pháp >>> data.write('values.dat', format='ascii', overwrite=True) 1