使用Python或熊猫,提取只能从TXT或DAT文件中的字符串

问题描述:

我有一个.dat文件具有以下形状是几百行代码:使用Python或熊猫,提取只能从TXT或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, ...]这样的列表。我试图用熊猫做到这一点,但由于列的奇怪格式,文件没有被正确读取。我还没有在互联网上找到任何其他短而简单的解决方案,尽管这应该有一个很好的pythonic解决方案。

有没有解决方案如何只提取字符串?


建议解决方案:

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) 

请张贴,可能是简单或较短的任何解决方案!

从解析开始,然后根据字符或数据类型选择需要的刺或选择不需要的。

例如取消基于不必要的字符串的字符:

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

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

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

谢谢!最终我以类似的方式解决了一个问题,但是使用不基于字符的取消选择,而是基于如果字符串可以转换为浮动。我在我的问题中添加了解决方案,但也许有人可以粘贴更短,更简单的解决方案 – Nestak

如果你在阅读它,然后列表:

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)] 
+0

不幸的是,我正在尝试将它们作为列表读取,但我不知道该怎么做。我目前正在阅读'开放('bla.dat')文件:',我不知道如何最有效地继续。我认为可能有一个更好的方式,像pandas – Nestak

+0

这样的东西:'data = []''for row in file:data.append(row.split(“”))'然后运行上面的代码?像那样的东西。但是,如果你可以把它变成一个熊猫数据框,这将是最好的。您只需使用head = list(df) –

你可以使用列表解析创建化学品标题和正则表达式以匹配其名称:

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']

在这个例子中,你只是匹配所需的每条线上的化学品名称模式,如果匹配其添加到列表中。但是你仍然需要逐行阅读来创建列表。

+0

提取标题谢谢!这确实很短。 're.findall('^ \ w +',line)''和're.search('^ \ w +',line)'做了什么?他们的功能如何被理解? – Nestak

+0

're.findall(pattern,string)'返回一个包含字符串内模式匹配的列表。如果模式在字符串内匹配,'re.search(pattern,string)'只返回一个对象,因此它更多地用作条件('if')。模式'^ \ w +'在字符串('^')的开头搜索任何单词字符('\ w')。量词“+”告诉搜索至少一个或多个此前的标记(单词字符)。有关更多信息,请参阅https://docs.python.org/2/library/re.html –