2017-03-04 63 views
2

我試圖從壓縮歸檔中將文本文件讀入Pandas數據框。該文件的格式是這樣的:將固定寬度的文本文件從zipfiles讀取到Pandas數據框中

System Time  hh:mm:ss   PPS  Zsec(sec)   Hex Message 

Yr=17 Mn= 3 Dy= 3 

19:22:59.894  19:22:16  52   69736  7E 32 02 4F 02 00 0C 7F 97 68 10 01 00 11 03 03 13 16 10 34 00 00 00 05 02 00 80 00 83 B1 7E 
19:24:12.130  19:23:10  106   69790  7E 32 02 4F 02 00 0C 7F 97 9E 10 01 00 11 03 03 13 17 0A 6A 00 00 00 05 12 00 BA 00 47 DF 7E 
19:24:13.241  19:23:11  107   69791  7E 32 02 4F 02 00 0C 7F 97 9F 10 01 00 11 03 03 13 17 0B 6B 00 00 00 05 05 00 BC 00 F3 AC 7E 

如果文件歸檔外提取的,我可以讀取它:

data = '../data/test1/heartbeat.txt' 
df = pd.read_csv(data, sep='\s{2,}', engine='python', skiprows=4, encoding='utf8', 
       names=['System Time','hh:mm:ss','PPS','Zsec(sec)', 'Hex Message']) 

但是,如果我嘗試訪問它的壓縮文件內部的方法未能:

zf = zipfile.ZipFile('../data.zip', 'r') 
data = zf.open('data/test1/heartbeat.txt') 
df = pd.read_csv(data, sep='\s{2,}', engine='python', skiprows=4, encoding='utf8', 
       names=['System Time','hh:mm:ss','PPS','Zsec(sec)', 'Hex Message']) 

我看TypeError: cannot use a string pattern on a bytes-like object

如果我使用delim_whitespace代替\s{2,}它讀取文件。所以看起來我正在成功使用zipfile。但是,「十六進制消息」列包含單個空格,這些空格會分解爲數據框中的許多列。

我用固定寬度列讀取,read_fwf,這還與提取的文件也嘗試:

data = '../data/test1/heartbeat.txt' 
widths = [13,14,10,13,100] 
df = pd.read_fwf(data,widths=widths,skiprows=4, 
       names = ['System Time', 'hh:mm:ss', 'PPS', 'Zsec(sec)','Hex Message']) 

但是當文件是zip壓縮包裏面還是失敗:TypeError: a bytes-like object is required, not 'str'

我不確定如何將這些類似字節的對象從zip文件轉換爲Pandas閱讀器可以解析的東西。

回答

2

這是爲我工作:

zf = zipfile.ZipFile('../data.zip', 'r') 
data = io.StringIO(zf.read('data/test1/heartbeat.txt').decode('utf_8')) 
df = pd.read_csv(data, sep='\s{2,}', engine='python', skiprows=4, encoding='utf8', 
       names=['System Time','hh:mm:ss','PPS','Zsec(sec)', 'Hex Message']) 
+1

剛發現'''io.TextIOWrapper'''我更喜歡。 – nlsn

相關問題