如何更正ASCII数据中的格式错误或使用python正确读取数据?

2024-09-26 22:51:58 发布

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

我正在将大型ASCII文件读入python,其中包含某些大气化合物的排放数据。我使用以下函数从列中读取数据,该函数返回一个包含列中值的列表:

def get_col(col):
    f = open(file_name, 'r')
    col_data = []
    # Loop over lines and extract column of interest
    for line in f:
        line = line.strip()
        columns = line.split()
        col_data.append(float(columns[col]))
    f.close()
    return col_data

到目前为止还不错。但是,我遇到了这样一个问题:在某些行中,由于某种原因,数据不是预期的格式。作为一个例子,我从我的数据中包括了四行。前两行是数据的外观,后两行是出错的地方。你知道吗

17  127 15  3.61    0   0   0   3.61    0   0   0   0   0   0

17  128 15  3.61    0   0   0   3.61    0   0   0   0   0   0

17  129 15  11.1    2 0.0   0 0.0   0 2.1   2 3.6   4 0.0   1 0.0   0 0.0   0 4.7   3 0.6   2 0.00

17  130 15  11.1    2 0.0   0 0.0   0 2.1   2 3.6   4 0.0   1 0.0   0 0.0   0 4.7   3 0.6   2 0.00

Correct row 4: 

17  130 14  11.12   0.00  0.00  2.12  3.64  0.01  0.01  0.00  4.73  0.62  0.00

在最后两行中,第1-3列中的值仍然正确,但从第4列开始,在每个值的第一个和第二个小数点之间包含额外的空格。这当然会导致读取数据时出错。你知道吗

我该如何解决这个问题?我更喜欢python的解决方案,但我也愿意使用其他解决方案来修复数据的格式。你知道吗

编辑: 链接到数据:https://github.com/AartZwaan/CO_data


Tags: columns文件数据函数列表datadef格式
3条回答

Fabio的答案确实很好,但可能不需要考虑损坏的数据并不总是像示例那样。在给定的文件中,有这样的行,其中错误以点结束或开始:

17      217     20.     1 0.2     1 0   .10 0.0

我建议使用这个正则表达式来修正行并保持相同的格式(每列之间有表格)

correct_line = re.sub(r"\t[\d\.]+ {1}", lambda t: t.group(0).strip()+'\t' , line)

您可以使用以下正则表达式处理每一行:

re.sub(r"(\.\d*)\s*(\d\s{1}\S)", r'\1\2', correct_line)

例如,给定您的输入:

correct_line = "17  128 15  3.61    0   0   0   3.61    0   0   0   0   0   0"
wrong_line = "17  130 15  11.1    2 0.0   0 0.0   0 2.1   2 3.6   4 0.0   1 0.0   0 0.0   0 4.7   3 0.6   2 0.00"

使用正确的行,没有任何变化:

re.sub(r"(\.\d*)\s*(\d\s{1}\S)", r'\1\2', correct_line)
# '17  128 15  3.61    0   0   0   3.61    0   0   0   0   0   0'

曾经分裂成以下列表:

['17', '128', '15', '3.61', '0', '0', '0', '3.61', '0', '0', '0', '0', '0', '0']

错误的行取而代之的是:

re.sub(r"(\.\d*)\s*(\d\s{1}\S)", r'\1\2', wrong_line)
# '17  130 15  11.12 0.00 0.00 2.12 3.64 0.01 0.00 0.00 4.73 0.62 0.00'

曾经分裂成以下列表:

['17', '130', '15', '11.12', '0.00', '0.00', '2.12', '3.64', '0.01', '0.00', '0.00', '4.73', '0.62', '0.00']

我认为您可以删除源文件中的空格(但不能删除制表符)。 如果你在一个类似unix的系统中,你可以运行

sed -i.bkp 's/ //g' gridCO

那么你的程序应该能够解析它。你知道吗

编辑

只能使用Python修改for循环中的第一行:

line = line.strip()

line = line.replace(' ','').strip()

相关问题 更多 >

    热门问题