[英]Efficient way to check for expected semicolon position length-delimited text file. Combining many "or" statements
[英]Reading “length-delimited” files in pandas?
考慮以下文件test.dat
:
123ABC3.5401
456DEF3.9001
789FED10.902
122GRE16.003
133SSA42.102
145ASS45.001
從技術上講,這是一個柱狀文件,盡管事實可能不如CSV文件那樣清楚。
該文件的列是這樣划分的: ID
是前三個字符(即,從索引0到2,包括零索引字符串,包括零), Group
從第四個字符到第六個字符,並且Value
占用字符七點到十二點。
這是我目前正在讀入此文件並將其轉換為pandas.DataFrame
對象的方式:
import pandas as pd
col_lengths = {'ID': range(0, 3), 'Group': range(3, 6), 'Value': range(6, 12)}
col_lengths = {k: set(v) for k, v in col_lengths.items()}
df = pd.DataFrame(data=None, columns=col_lengths.keys())
with open('length_delimiter_test.dat', 'r') as f:
for row in f:
current = row.strip()
values_enum = list(enumerate(current))
row_dict = {col: ''.join(v for idx, v in values_enum if idx in col_lengths[col]) for col in col_lengths}
df = df.append(row_dict, ignore_index=True)
這給了我我想要的東西:
Group ID Value
0 ABC 123 3.5401
1 DEF 456 3.9001
2 FED 789 10.902
3 GRE 122 16.003
4 SSA 133 42.102
5 ASS 145 45.001
但是,這種方法對於我的口味有點冗長。 我基本上希望將上面的col_lengths
字典傳遞給類似pandas.read_table
的函數,但是我在pandas文檔中看不到任何允許這種行為的東西。 像這樣:
df = pd.read_table('length_delimiter_test.dat', col_parser=col_lengths)
有誰知道pandas(或任何Python包)中更簡潔的內置功能? 我沒有找到像這樣解析長度分隔文件的強大軟件包。
編輯:感謝MaxU推薦我到pandas.read_fwf
:
pd.read_fwf('length_delimiter_test.dat', colspecs=[(min(x), max(x)+1) for x in col_lengths.values()], header=None, names=col_lengths.keys())
Out[55]:
Group ID Value
0 ABC 123 3.5401
1 DEF 456 3.9001
2 FED 789 10.9020
3 GRE 122 16.0030
4 SSA 133 42.1020
5 ASS 145 45.0010
感謝MaxU (他確實應該得到這個答案的功勞)將我引薦給pandas.read_fwf
:
pd.read_fwf('length_delimiter_test.dat', colspecs=[(min(x), max(x)+1) for x in col_lengths.values()], header=None, names=col_lengths.keys())
Out[55]:
Group ID Value
0 ABC 123 3.5401
1 DEF 456 3.9001
2 FED 789 10.9020
3 GRE 122 16.0030
4 SSA 133 42.1020
5 ASS 145 45.0010
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.