我有一个文本文件,其中有多个分隔符来分隔值。从中我只想读取管道分隔值
例如,数据如下:'10|10|10|10|10|110|10|10|10;10:10:10,10,10,10。。。等'
我只想读取多达8个管道分隔的值作为数据帧,并忽略带有",:&";。我该怎么做?
这将是一个两步的过程。首次读取以|
作为分隔符的csv
df = pd.read_csv(StringIO(
"10|10|10|10|10|10|10|10|10;10:10:10,10,10,10"
), delimiter='|', header=None)
0 1 2 3 4 5 6 7 8
0 10 10 10 10 10 10 10 10 10;10:10:10,10,10,10
然后通过删除[;,:]
之后的字符串来更新最后一列
df.iloc[:, -1] = df.iloc[:, -1].str.replace(r'[;,:].*', '', regex=True)
0 1 2 3 4 5 6 7 8
0 10 10 10 10 10 10 10 10 10
如果您知道必须忽略的确切字符,则可以使用comment
属性,如下所示。1个字符字符串之后的所有内容都将被忽略。
df = pd.read_csv(StringIO(
"10|10|10|10|10|10|10|10|10;10:10:10,10,10,10"
), delimiter='|', header=None, comment=';')
df
0 1 2 3 4 5 6 7 8
0 10 10 10 10 10 10 10 10 10
这比其他提出的解决方案更长,但可能更快,因为它只读取需要的内容。它将结果收集为列表,但可能是另一种容器类型:
df = "10,10,10,10|10|10|10|10|10|10|10|10;10:10:10,10,10,10"
coll = []
start = 0
prevIdx = -1
while True:
try:
idx = df.index("|", start)
if prevIdx >= 0:
n = int(df[prevIdx+1:idx])
if isinstance(n, int): coll.append(n)
start = idx+1
prevIdx = idx
except:
break;
print(coll) # ==> [10, 10, 10, 10, 10, 10, 10]