<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 如何使用Python讀寫檔案資料？
參考資料
Python Standard Library
<a href="https
Step1:  下面兩個 cell 分別演示如何使用 urllib來透過 url 抓取資料
*  SDSS的 fits binary table, 裡面存的是光譜
*  NOAA的太陽黑子預測, 純文字檔案
執行後會多出兩個檔案 "spec.fits"和 "astro_table.txt", 可以用以前熟悉的工具先看看資料的內容與格式, 這樣比較有 fu...
Step2:  Lab：請修改 url 為你自己感興趣的資料來源, 下載資料並存在自己命名的檔案中
範例：用Astropy 讀 FITS檔
參考文件
Step3:  hdulist 顧名思義, 就是 a list of Header/Data Unit (廢話), 關於 FITS檔案的格式, 請參閱 http
Step4:  雖然落落長一串, 希望你的眼睛沒有什麼業障, 可以發現有一些有趣的屬性/方法, 像是 data, dump, writeto... 等等
接下來就繼續冒險前進, 用點點 (.) 來探索新世界吧
所以就 .data
Step5:  你看看你, data這不就來了嗎~~~
好, 看來這像是個 numpy 的 record array (or structured array), 格式長這樣 
Step6:  好滴... 這個演示就先告個段落, 記得要把打開的東西 (hdulist) 關起來, 養成好習慣以後才不會很難改
Step7:  範例：用Numpy讀寫檔案
Step8:  範例：用Astropy讀寫 ASCII 檔案
# 尚需要更合適的檔案來當範例
# 更新使用 NOAA的太陽黑子預報 http
Step9:  read() 出來的是個 table 物件, dir()的樂趣我就留給各位, 下面直接舉兩個常用的例子
<ASSISTANT_TASK:>
Python Code:
# import urllib.request
import urllib
Explanation: 如何使用Python讀寫檔案資料？
參考資料
Python Standard Library
<a href="https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files" target="_blank">Tutorial for reading and writing files</a>
<a href="https://docs.python.org/3/library/csv.html" target="_blank">CSV File Reading and Writing</a>
NumPy & SciPy
<a href="http://docs.scipy.org/doc/numpy/reference/routines.io.html" target="_blank">Input and output routines in NumPy</a>
<a href="http://docs.scipy.org/doc/scipy/reference/tutorial/io.html" target="_blank">SciPy tutorial for file IO</a>
Astropy
<a href="http://docs.astropy.org/en/stable/io/unified.html" target="_blank">Unified file read/write interface</a>
<a href="http://docs.astropy.org/en/stable/io/fits/index.html" target="_blank">FITS File handling (astropy.io.fits)</a>
<a href="http://docs.astropy.org/en/stable/io/ascii/index.html" target="_blank">ASCII Tables (astropy.io.ascii)</a>
<a href="http://docs.astropy.org/en/stable/io/votable/index.html" target="_blank">VOTable XML handling (astropy.io.votable)</a>
<a href="http://docs.astropy.org/en/stable/io/misc.html" target="_blank">Miscellaneous Input/Output (astropy.io.misc)</a>
<a href="http://docs.astropy.org/en/stable/vo/index.html" target="_blank">Virtual Observatory Access (astropy.vo)</a>
準備工作：所需檔案下載
注意：python2 與 python3 下的 urllib有點不同, 下面修改成 python2 的環境, python3的語法會 comment 起來
End of explanation
fitsurl="http://dr10.sdss3.org/sas/dr10/sdss/spectro/redux/26/spectra/0651/spec-0651-52141-0569.fits"
#urllib.request.urlretrieve(fitsurl,"spec.fits")
urllib.urlretrieve(fitsurl,"spec.fits")
texturl="http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt"
#urllib.request.urlretrieve(texturl, "astro_table.txt")
urllib.urlretrieve(texturl, "astro_table.txt")
Explanation: 下面兩個 cell 分別演示如何使用 urllib來透過 url 抓取資料
*  SDSS的 fits binary table, 裡面存的是光譜
*  NOAA的太陽黑子預測, 純文字檔案
執行後會多出兩個檔案 "spec.fits"和 "astro_table.txt", 可以用以前熟悉的工具先看看資料的內容與格式, 這樣比較有 fu...
End of explanation
from astropy.io import fits
hdulist = fits.open('spec.fits')
hdulist.info()
Explanation: Lab：請修改 url 為你自己感興趣的資料來源, 下載資料並存在自己命名的檔案中
範例：用Astropy 讀 FITS檔
參考文件: <a href="http://docs.astropy.org/en/stable/io/fits/index.html" target="_blank">Astropy FITS File handling</a>
End of explanation
dir(hdulist[4])
Explanation: hdulist 顧名思義, 就是 a list of Header/Data Unit (廢話), 關於 FITS檔案的格式, 請參閱 http://fits.gsfc.nasa.gov/fits_primer.html 裡面有詳盡的說明
hdulist.info() 會把每個 element的摘要列出來, 以上面的例子來說, 就是讀進來的 spec.fits 他有 12個 units, 第 0個就是個純的 header, 第 1,2,3個 unit應該是一些 meta data, 真正的科學資料是從第 4個 unit開始, 格式為 binary table, 接下來我們就用第四個 unit 來作演示
通常在不太了解新的物件時, dir() 是我們的好朋友, 方便我們猜測可以對這個陌生的物件做些什麼事情。 所以, 就 dir()吧
End of explanation
hdulist[4].data
Explanation: 雖然落落長一串, 希望你的眼睛沒有什麼業障, 可以發現有一些有趣的屬性/方法, 像是 data, dump, writeto... 等等
接下來就繼續冒險前進, 用點點 (.) 來探索新世界吧
所以就 .data
End of explanation
hdulist[4].data["flux"]
Explanation: 你看看你, data這不就來了嗎~~~
好, 看來這像是個 numpy 的 record array (or structured array), 格式長這樣 : ([(v1, v2, v3...), (), .... ()], dtype=(type1, type2, type3...)), 不難猜測 v1 對應 type1... 以此類推
所以, 17.107是 flux, 3.79是 loglam.... 等等等等
我想 loglam是 lambda 的 log這種事應該猜的到齁？還猜不到的話, 恭喜你, 還中毒未深~~~ 
要抓出 flux 或任意 type的方法也很直覺
End of explanation
hdulist.close()
Explanation: 好滴... 這個演示就先告個段落, 記得要把打開的東西 (hdulist) 關起來, 養成好習慣以後才不會很難改
End of explanation
# 尚需要更合適的檔案來當範例
import numpy as np
讀進的array = np.loadtxt("檔名") 
# 對讀進的array做一些運算後存成新array，然後將新array寫到一個新檔案中 (代補)
np.savetxt('新檔名', 新array)
Explanation: 範例：用Numpy讀寫檔案
End of explanation
from astropy.io import ascii
#data = ascii.read("astro_table.txt")
data = ascii.read("astro_table.txt",data_start=2)  
print(data)
Explanation: 範例：用Astropy讀寫 ASCII 檔案
# 尚需要更合適的檔案來當範例
# 更新使用 NOAA的太陽黑子預報 http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt
astropy 的 ascii 提供相當完整的 ascii 讀取方案, 除了基本的格式外, 還支援 csv, cds (vizier), latex, DAOPHOT, Sextractor... 天文領域中常見的 ascii 表格大概都可以無痛讀取, 不需要自己花時間解析
用法也很直覺, 如下:
End of explanation
print(data["col5","col1"])
d = np.where((data["col1"] >= 2017) & (data["col1"] <= 2019) & (data["col2"] >=6) & (data["col2"] <=9))
print(d)
print(data[d]["col1","col2","col3"])
dir(data)
data.write("out", format="ascii")
Explanation: read() 出來的是個 table 物件, dir()的樂趣我就留給各位, 下面直接舉兩個常用的例子:
* 抽取特定的 column(s)
* 使用 where() 來抓取符合條件的 rows
End of explanation
<END_TASK>