【问题标题】:python How to split irreguarly delimited file?python如何拆分不规则分隔的文件?
【发布时间】:2015-11-19 22:28:02
【问题描述】:

由于一些新格式化且结构不佳的数据文件,我遇到了一个有趣的问题。它们是文本文件,以逗号分隔,包含多组数据,每组数据都有一个唯一的标题。最初我使用 genFromTxt 仅读取一个带有一个标头的数据实例。现在有了多个实例, genFromTxt 就无法处理它。将文件拆分并将每个单独的实例输入 genFromTxt 的最佳方法是什么?这是该文件的示例。来自第一个实例的数据立即与第二个实例的标头对接。每个文件重复大约 20 次。我还没有找到一个通用的分隔符来分隔它们。

       0.8 9999.0 999.0 999.0 999.0 9999.0 9999.0 999.0 999.0 999.0 9999.000 999.000 999.0 999.0 99999.0  9.0  9.0  9.0  9.0  9.0  9.0
       0.5 9999.0 999.0 999.0 999.0 9999.0 9999.0 999.0 999.0 999.0   72.380  -7.761 999.0 999.0 99999.0  9.0  9.0  9.0  9.0  9.0  9.0
       0.3 9999.0 999.0 999.0 999.0 9999.0 9999.0 999.0 999.0 999.0 9999.000 999.000 999.0 999.0 99999.0  9.0  9.0  9.0  9.0  9.0  9.0
       0.0 9999.0 999.0 999.0 999.0 9999.0 9999.0 999.0 999.0 999.0   72.381  -7.760 999.0 999.0 99999.0  9.0  9.0  9.0  9.0  9.0  9.0
      -1.0  906.7  20.0  18.9  92.8  -10.1   -3.7  10.7  70.0 999.0   72.380  -7.761 999.0 999.0   953.8  1.0  1.0  1.0  1.0  1.0  9.0
    Data Type:                         AVAPS SOUNDING DATA, Channel 2/Descending
    Project ID:                        DYNAMO
    Release Site Type/Site ID:         NOAA P3/N43RF 20111116I1
    Release Location (lon,lat,alt):    072 12.04'E, 08 11.50'S, 72.201, -8.192, 966.4
    UTC Release Time (y,m,d,h,m,s):    2011, 11, 16, 04:22:07
    Reference Launch Data Source/Time: IWGADTS Format (IWG1)/04:22:07
    Sonde Id:                          110355308
    System Operator/Comments:          TMR/none, Good Drop
    Post Processing Comments:          Aspen Version 3.1; Created on 01 Feb 2012 23:18 UTC; Configuration research-dropsonde
    /
    /
    Nominal Release Time (y,m,d,h,m,s):2011, 11, 16, 04:22:07
     Time  Press  Temp  Dewpt  RH    Ucmp   Vcmp   spd   dir   Wcmp     Lon     Lat   Ele   Azi    Alt    Qp   Qt   Qrh  Qu   Qv   QdZ
      sec    mb     C     C     %     m/s    m/s   m/s   deg   m/s      deg     deg   deg   deg     m    code code code code code code
    ------ ------ ----- ----- ----- ------ ------ ----- ----- ----- -------- ------- ----- ----- ------- ---- ---- ---- ---- ---- ----
      89.8 1011.6  27.3  23.9  81.0 9999.0 9999.0 999.0 999.0 999.0 9999.000 999.000 999.0 999.0     0.0  1.0  1.0  1.0  9.0  9.0  9.0

【问题讨论】:

  • 当新对象出现时,Data Type: 是否始终存在?数字行中的值的数量是恒定的吗?
  • @duhaime 是的,Data Type: 始终存在,但有时后面会跟着一个字符串。行数应该是恒定的。我没有检查整个文件,因为它相当大。
  • 在这种情况下,我会将每一行读入内存,然后如果该行以 Data Type: 开头,我会说我现在正在处理一个新文件
  • @duhaime 感谢您的建议!我正在尝试使用布尔标志进行类似的操作,但也试图挑出一些头脑并跳出框框思考。

标签: python file csv genfromtxt


【解决方案1】:

您可以修改类似...的代码(Python3 警告,如果您想在 Python2.7+ 中运行此代码,请将 range() 替换为 xrange()(出于效率目的))

def readSacredAttribute(holyInput):
    raw = [ x.strip() for x in holyInput.readline()[:-1].split(':') ]
    newRaw = []
    for i in range(len(raw) - 1):
        for x in [ x.strip() for x in raw[ i + 1 ].split(',') ]:
            newRaw.append(x)

    raw[ 1 : ] = newRaw

    parameters = {}
    if '(' in raw[0]:
        base = raw[0].index('(') + 1
        to = raw[0].index(')')
        splitted = [ x.strip() for x in raw[1].split(',') ]
        for i, x in enumerate([ x.strip() for x in raw[0][ base : to ].split(',') ]):
            parameters[x] = splitted[i]

    return (raw, parameters)

def splitThisStupidMess(holyInput):
    holyHeader = []
    for i in range(6):
        holyHeader.append([ float(x) for x in holyInput.readline().split()])

    sacredAttributes = { x[0][0] : (x[0][1], x[1]) for x in [  readSacredAttribute(holyInput) for i in range(9) ] }

    # Ignore the '\' lines
    for i in range(2):
        holyInput.readline()

    nominalTime = readSacreAttribute(holyInput)
    sacredAttributes[nominalTime[0][0]] = (nominalTime[0][1], nominalTime[1])

    divineNames = holyInput.readline().split()
    divineUnits = holyInput.readline().split()
    holyInput.readline()    # Avoid decoration...
    divineValues = [ float(x) for x in holyInput.readline().split() ]

    divineFooter = { divineNames[i] : (divineUnits[i], divineValues[i]) for i in len(divineNames) }

    return (holyHeader, sacredAttributes, divineFooter)

【讨论】:

  • 谢谢!喜欢变量名!哈哈。拆分很烦人:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2011-09-06
相关资源
最近更新 更多