对于Python或Pandas,只从txt或datfi中提取字符串

2024-09-26 17:44:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个.dat文件,形状如下,有几百行长:

AlOH                 200  6000  1000
 7.882068110E+05 -2.263671626E+03  7.823954880E+00  1.821171456E-04 -8.263729320E-08  1.265414876E-11 -6.875972530E-16 -1.039808093E+04 -2.209032458E+01
 5.876493180E+04 -9.449422690E+02  7.820599180E+00  5.858888470E-04 -4.083666810E-06  4.587229340E-09 -1.563936726E-12 -1.993283011E+04 -2.065043885E+01
Al2O                 200  6000  1000
-1.171074351E+05 -1.783009166E+02  7.633215360E+00 -5.335931770E-05  1.180702791E-08 -1.355444579E-12  6.287323890E-17 -1.947580149E+04 -1.415764167E+01
 7.776530700E+03 -1.294235361E+02  4.912509520E+00  8.604223450E-03 -1.217703648E-05  8.314634870E-09 -2.237722201E-12 -1.886512879E+04 -2.806368311E-02
Al2O3                200  6000  1000
-2.777784969E+05 -4.917465930E+02  1.386703888E+01 -1.469381940E-04  3.250406490E-08 -3.730867350E-12  1.730444284E-16 -6.790757850E+04 -4.375559873E+01
-7.443374320E+03  8.829004210E+01  5.264662640E+00  2.507678848E-02 -3.434541650E-05  2.302516980E-08 -6.122529280E-12 -6.872685950E+04  2.202324298E+00

我只想从中提取化学名称(所以只提取字符串),最好是像[AlOH, Al2O, Al2O3, ...]这样的列表。我试着用pandas做这个,但是由于列的奇怪格式,文件没有被正确读取。我还没有在互联网上找到任何其他解决方案,将是简短和简单的,虽然这应该有一个很好的Python解决方案。你知道吗

有没有人能解决如何只提取字符串的问题?你知道吗


建议解决方案:

chemicals = []
with open('bla_file.dat') as file:
    for line in file: 
        line = line.split()
        for item in line:
            try:
                float(item)
            except ValueError:
                chemicals.append(item)

请张贴任何可能更简单或更短的解决方案!你知道吗


Tags: 文件字符串inforline解决方案itemdat
3条回答

您可以使用列表理解来创建标题,并使用正则表达式来匹配其名称:

with open('bla_file.dat') as f:

    chemicals = [re.findall('^\w+',line)[0] for line in f.readlines() if re.search('^\w+',line)]

在您展示的示例中,它返回:

['AlOH', 'Al2O', 'Al2O3']

在本例中,您只需在每行上匹配化学品名称所需的模式,并在匹配的情况下将其添加到列表中。但是你仍然需要逐行阅读来创建列表。你知道吗

如果你把它作为一个列表来阅读,那么:

lst = [1,5,'Chemical1', 1.05543, 'Chemical2']
chemLst = []
for x in lst:
    if isinstance(x, str):
        chemLst.append(x)

或者

chemLst = [i for i in lst if isinstance(i, str)]

从解析开始,然后根据字符或数据类型选择所需的stings或取消选择不需要的stings。你知道吗

基于不需要的字符串中的字符取消选择的示例:

nstr = ['.','+','-']

for line in lines:
    str = line.split(' ')

    for str in line:
        if str.findall(nstr):
            continue
        else
            print str

相关问题 更多 >

    热门问题