使用Python或Pandas,仅从txt或dat文件中提取字符串
我有一个.dat文件,形状如下,有几百行长:使用Python或Pandas,仅从txt或dat文件中提取字符串,python,pandas,dataframe,extraction,file-read,Python,Pandas,Dataframe,Extraction,File Read,我有一个.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.
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做这个,但是由于列的奇怪格式,文件没有被正确读取。我还没有在互联网上找到任何其他简短的解决方案,尽管这应该有一个很好的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)
请发布任何可能更简单或更短的解决方案 从解析开始,然后根据字符或数据类型选择所需的Sting或取消选择不需要的Sting 基于不需要的字符串中的字符取消选择的示例:
nstr = ['.','+','-']
for line in lines:
str = line.split(' ')
for str in line:
if str.findall(nstr):
continue
else
print str
从解析开始,然后根据字符或数据类型选择所需的stings或取消选择不需要的stings 基于不需要的字符串中的字符取消选择的示例:
nstr = ['.','+','-']
for line in lines:
str = line.split(' ')
for str in line:
if str.findall(nstr):
continue
else
print str
如果您将其作为列表阅读,则:
lst = [1,5,'Chemical1', 1.05543, 'Chemical2']
chemLst = []
for x in lst:
if isinstance(x, str):
chemLst.append(x)
或
如果您将其作为列表阅读,则:
lst = [1,5,'Chemical1', 1.05543, 'Chemical2']
chemLst = []
for x in lst:
if isinstance(x, str):
chemLst.append(x)
或
您可以使用列表理解来创建化学品标题,并使用正则表达式来匹配其名称:
with open('bla_file.dat') as f:
chemicals = [re.findall('^\w+',line)[0] for line in f.readlines() if re.search('^\w+',line)]
在您展示的示例中,它返回:
在本例中,您只需匹配每行化学品名称所需的模式,并在匹配的情况下将其添加到列表中。但是您仍然需要逐行阅读来创建列表。您可以使用列表理解来创建化学品标题,并使用正则表达式来匹配其名称:
with open('bla_file.dat') as f:
chemicals = [re.findall('^\w+',line)[0] for line in f.readlines() if re.search('^\w+',line)]
在您展示的示例中,它返回:
在本例中,您只需匹配每行化学品名称所需的模式,并在匹配的情况下将其添加到列表中。但是你仍然需要逐行阅读来创建列表。不幸的是,我试图将它们作为列表来阅读,但我不知道怎么做。我现在读的是,open('bla.dat')是文件:
,我不知道如何最有效地继续。我认为使用PandaSomething可能有更好的方法,比如:data=[]
对于文件中的行:data.append(row.split(“”)
,然后运行上面的代码?诸如此类的事。但是如果你能把它很好地放到熊猫数据框中,那将是最好的。您只需使用head=list(df)提取标题,不幸的是,我试图将它们作为列表来阅读,但我不知道如何做。我现在读的是,open('bla.dat')是文件:
,我不知道如何最有效地继续。我认为使用PandaSomething可能有更好的方法,比如:data=[]
对于文件中的行:data.append(row.split(“”)
,然后运行上面的代码?诸如此类的事。但是如果你能把它很好地放到熊猫数据框中,那将是最好的。您只需使用head=list(df)提取标题,谢谢!最终,我以类似的方式解决了一个问题,但使用取消选择不是基于字符,而是基于字符串是否可转换为浮点。我在我的问题中添加了解决方案,但也许有人可以粘贴一个更短更简单的解决方案谢谢!最终,我以类似的方式解决了一个问题,但使用取消选择不是基于字符,而是基于字符串是否可转换为浮点。我在我的问题中添加了解决方案,但也许有人可以粘贴一个更短更简单的解决方案谢谢!这确实很短。re.findall('^\w+',line)
和re.search('^\w+',line)
做什么?如何理解它们的功能?re.findall(pattern,string)
返回一个列表,其中包含字符串中模式的所有匹配项。re.search(pattern,string)
仅在模式在字符串中匹配时返回对象,因此它更多地用作条件(if
)。模式^\w+
在字符串(^
)的开头搜索任何单词字符(\w
)。量词+
指示搜索至少一个或多个上述标记(单词字符)。欲了解更多信息,请查看谢谢!这确实很短。re.findall('^\w+',line)
和re.search('^\w+',line)
做什么?如何理解它们的功能?re.findall(pattern,string)
返回一个列表,其中包含字符串中模式的所有匹配项。re.search(pattern,string)
仅在模式在字符串中匹配时返回对象,因此它更多地用作条件(if
)。模式^\w+
在字符串(^
)的开头搜索任何单词字符(\w
)。量词+
指示搜索至少一个或多个上述标记(单词字符)。欲了解更多信息,请查看