繁体   English   中英

解析混合的结构化和非结构化数据

[英]Parsing mixed structured and unstructured data

我们领域中的许多光谱数据,模拟输出文件...都是结构化和非结构化数据的混合。

下面的文件是一个示例,其中三个点代表中间的其他行。

...
...
---------------------------------------------------------------------------------------------------
DGA/MPI-2 Parallel Environment:    4 Molcas's processes are running on   1 node(s) x  4 cores each 
----------------------------------------------------------------------------------------------------
...
...
      Mulliken charges per centre and basis function type
      ---------------------------------------------------

             O1      C2      CR3     O4      CR5     O6      O7      C8      O9      O10     O11     C12
      1s     1.9991  1.9984  2.0000  1.9992  2.0000  1.9986  1.9986  1.9983  1.9993  1.9987  1.9986  1.9983
      2s     1.7994  1.0697  2.0000  1.8080  2.0000  1.8648  1.8692  1.0827  1.7580  1.8781  1.8582  1.0834
      2px    1.9368  0.7559  2.0000  1.9364  2.0000  1.6998  1.6786  0.7228  1.9829  1.6891  1.7016  0.7757
      2pz    1.4406  0.6506  2.0000  1.4297  2.0000  1.7096  1.6791  0.6758  1.4469  1.6580  1.7045  0.6490
      2py    1.7790  0.5652  2.0000  1.7909  2.0000  1.5122  1.5263  0.5719  1.5781  1.4733  1.5474  0.5655
      3s    -0.0040  0.0107  1.9934 -0.0041  1.9932 -0.0093 -0.0095  0.0091 -0.0064 -0.0072 -0.0099  0.0106
      3px   -0.0032  0.0205  1.9939 -0.0031  1.9942 -0.0111 -0.0139  0.0189 -0.0015 -0.0107 -0.0145  0.0460
      3pz   -0.0122 -0.0118  1.9936 -0.0114  1.9936 -0.0077 -0.0073 -0.0072 -0.0102 -0.0070 -0.0076 -0.0035
      3py   -0.0021  0.1446  1.9912  0.0005  1.9919 -0.0113 -0.0112  0.1360 -0.0070 -0.0087 -0.0125  0.1386
      4s     0.0000  0.0000  0.1958  0.0000  0.1914  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
      3d2+   0.0000  0.0000  0.6978  0.0000  0.6939  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
      3d1+   0.0000  0.0000  0.4320  0.0000  0.4423  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000

通常,某些部分必须手动解析,但是如果到达示例表的开头,那么有关表大小的所有信息就在手边,并且使用成品表读取器将非常有用。 问题是,我认识的所有典型读者都不允许给出字节偏移量。 (csv模块,pandas,numpy)

这导致两种可能的解决方法:

  1. 给出了线偏移量。 这意味着被调用的csv阅读器将从头开始读取整个文件,并自己计算换行符。 我知道它们通常是用C语言实现的并且仍然非常快,但是我认为丢弃可用信息是很丑陋的。
  2. 创建一个字符串并将其作为StringIO对象传递给阅读器。

类似于以下示例代码:

import io
with open('test.log') as f:
    title = 'Mulliken charges per centre and basis function type'
    for line in f: 
        if title == line.strip():
            break
    f.readline()

    known_from_previous_parsing = 18
    mull_charges = ''.join([f.readline() for j in range(known_from_previous_parsing)])
    mull_charges = io.StringIO(mull_charges)
    mull_charges = pd.read_csv(mull_charges, delim_whitespace=True)

第二种方法的问题在于,它将表整块写入内存,从而抛弃了自动缓冲的所有优点……。 (在您问之前,这不是过早的优化,表可能会变得很大,以至于整体读取它们会导致交换。)

所以我的问题是:python中是否有csv解析工具可以指定字节偏移量。 或更笼统地说,我的方法正确吗?应该如何处理结构化和非结构化数据的这种混合?

不能说熊猫,但是通过csv模块,您可以前进文件指针(使用readline()next() ),直到您到达表格数据的第一行之前,然后像处理任何普通的csv文件一样进行操作(假设在表格数据之后没有更多的非结构化文本):

偏移量

This is useles
This is useles
This is useles

Data:
AAA,42
BBB,56
CCC,8878

Python Shell:

>>> import csv
>>> f = open("offset.dat")
>>> line = f.next()
>>> while not line.startswith("Data:"):
...     line = f.next()
... 
>>> line
'Data:\n'
>>> r = csv.reader(f)
>>> r.next()
['AAA', '42']
>>> r.next()
['BBB', '56']
>>> r.next()
['CCC', '8878']

假设此内容位于文件末尾,Pandas足够聪明地处理此问题。 使用the skiprows参数。

>>> import pandas as pd
>>> df = pd.read_csv('temp.txt', sep='\s+',skiprows=10)
>>> df
          O1      C2     CR3      O4     CR5      O6      O7      C8      O9  \
1s    1.9991  1.9984  2.0000  1.9992  2.0000  1.9986  1.9986  1.9983  1.9993   
2s    1.7994  1.0697  2.0000  1.8080  2.0000  1.8648  1.8692  1.0827  1.7580   
2px   1.9368  0.7559  2.0000  1.9364  2.0000  1.6998  1.6786  0.7228  1.9829   
2pz   1.4406  0.6506  2.0000  1.4297  2.0000  1.7096  1.6791  0.6758  1.4469   
2py   1.7790  0.5652  2.0000  1.7909  2.0000  1.5122  1.5263  0.5719  1.5781   
3s   -0.0040  0.0107  1.9934 -0.0041  1.9932 -0.0093 -0.0095  0.0091 -0.0064   
3px  -0.0032  0.0205  1.9939 -0.0031  1.9942 -0.0111 -0.0139  0.0189 -0.0015   
3pz  -0.0122 -0.0118  1.9936 -0.0114  1.9936 -0.0077 -0.0073 -0.0072 -0.0102   
3py  -0.0021  0.1446  1.9912  0.0005  1.9919 -0.0113 -0.0112  0.1360 -0.0070   
4s    0.0000  0.0000  0.1958  0.0000  0.1914  0.0000  0.0000  0.0000  0.0000   
3d2+  0.0000  0.0000  0.6978  0.0000  0.6939  0.0000  0.0000  0.0000  0.0000   
3d1+  0.0000  0.0000  0.4320  0.0000  0.4423  0.0000  0.0000  0.0000  0.0000   

         O10     O11     C12  
1s    1.9987  1.9986  1.9983  
2s    1.8781  1.8582  1.0834  
2px   1.6891  1.7016  0.7757  
2pz   1.6580  1.7045  0.6490  
2py   1.4733  1.5474  0.5655  
3s   -0.0072 -0.0099  0.0106  
3px  -0.0107 -0.0145  0.0460  
3pz  -0.0070 -0.0076 -0.0035  
3py  -0.0087 -0.0125  0.1386  
4s    0.0000  0.0000  0.0000  
3d2+  0.0000  0.0000  0.0000  
3d1+  0.0000  0.0000  0.0000  

如果不是,并且您知道或可以计算表中的行数,则仍可以将此类脚本与rows参数一起使用。

阅读带有熊猫的表格后,您可以将其发送到csv,sql db,excel等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM