筆者最近接收到了一批數(shù)據(jù),需要將處理并轉(zhuǎn)存為.npy格式以方便在工程上應(yīng)用。
這些文件乍一看以為是Excel的文件,因此筆者就想使用pandas來完成轉(zhuǎn)換垦江,但是,在使用pandas的read_excel時(shí)搅方,卻出現(xiàn)了如下的錯(cuò)誤比吭。
xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'<meta ht'
經(jīng)過筆者多方搜索,發(fā)現(xiàn)這是由于我們的.xls文件并不是標(biāo)準(zhǔn)的Excel文件腰懂,標(biāo)準(zhǔn)的Excel文件用文本編輯器打開應(yīng)該是一堆亂碼或一堆16進(jìn)制數(shù)字(因?yàn)镋xcel的存儲(chǔ)格式是二進(jìn)制格式)
但是筆者收到的類似Excel的文件其實(shí)是一種標(biāo)簽格式
由于這種標(biāo)簽和HTML的很像梗逮,因此筆者的思路就是先將其轉(zhuǎn)換為HTML格式项秉,然后在用pandas的read_html讀取其中的表格绣溜,從而完成數(shù)據(jù)處理。
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
import os
first_dir = "F:\新建文件夾" #打開初始文件夾
first_dirlist = os.listdir(first_dir) #遍歷文件夾下所有文件夾
for filename in first_dirlist:
sec_filelist = os.listdir(first_dir + "\\"+filename)
outdata = pd.DataFrame() #初始化數(shù)據(jù)
#建立表頭
outdata = outdata.append([["數(shù)據(jù)時(shí)間","潮位(cm)","雨量(mm)","水溫(℃)","鹽度","濕度(%)","氣壓(hPa)","氣溫(℃)","風(fēng)速(m/s)","風(fēng)向(°)","能見度(km)","輻射(μmol/㎡·s)"]])
print("正在打開"+filename+"文件夾")
for i in range(31):
name = str(i)+".xls"
if name in sec_filelist:
print("正在處理"+name)
#讀取非標(biāo)準(zhǔn)格式的.xls文件
realfile = first_dir + "\\"+filename+"\\"+name
htmlfile = open(realfile, 'r')
htmlhandle = htmlfile.read()
#將.xls文件轉(zhuǎn)換為HTML格式
soup = BeautifulSoup(htmlhandle, 'lxml')
outhtml = open(str(i)+".html", 'w')
outhtml.write(str(soup))
outhtml.close()
#使用pandas的read_html讀取文本中的表格數(shù)據(jù)
data = pd.read_html(str(i)+".html")
outdata = outdata.append(data[0][1::60])
np.save(filename, outdata) #存儲(chǔ)為.npy格式
print("輸出文件"+filename+".npy")