从具有多个分隔符的文本文件中只读取几个字段



我有一个文本文件,其中有多个分隔符来分隔值。从中我只想读取管道分隔值

例如,数据如下:'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]

最新更新