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

如何更正ASCII数据中的此格式错误或使用python正确读取数据?,python,ascii,Python,Ascii,我正在将大型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

我正在将大型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中的解决方案,但我也愿意使用其他解决方案来修复数据的格式

编辑:
链接到数据:

我认为您可以删除源文件中的空格(但不能删除制表符)。 如果您使用的是类unix系统,则只需运行

sed-i.bkp's///g'gridCO
然后你的程序应该能够解析它

编辑

仅使用Python可以修改
for
循环中的第一行:

line=line.strip()

line=line.replace(“”,).strip()

我认为您可以删除源文件中的空格(但不能删除制表符)。 如果您使用的是类unix系统,则只需运行

sed-i.bkp's///g'gridCO
然后你的程序应该能够解析它

编辑

仅使用Python可以修改
for
循环中的第一行:

line=line.strip()

line=line.replace(“”,).strip()

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

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']
['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']
使用错误的行,我们有:

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', '128', '15', '3.61', '0', '0', '0', '3.61', '0', '0', '0', '0', '0', '0']
['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']

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

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']
['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']
使用错误的行,我们有:

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', '128', '15', '3.61', '0', '0', '0', '3.61', '0', '0', '0', '0', '0', '0']
['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']

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

17      217     20.     1 0.2     1 0   .10 0.0
我建议使用这个正则表达式来修正行并保持相同的格式(每列之间有表格)


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

17      217     20.     1 0.2     1 0   .10 0.0
我建议使用这个正则表达式来修正行并保持相同的格式(每列之间有表格)


格式错误的行在数据文件中,是否正确?在这种情况下,准确了解文件的格式(列之间有多少空格等)非常重要。有了这些信息,你就更容易改正了,我在问题中添加了一个数据链接。如果你能看一看,那就太好了!我看了一下。我不知道太多关于这些信息,但它看起来像内容也可能被破坏。。。第四列从0-40跳到10469(如果我们像你在问题中那样连接错误分隔的数字)。这可能吗?看起来有效的列分隔符是制表符,多余的空格是空格。所以只要去掉所有的空格:
line=line.replace('',)
@Drago96这些值是可能的,虽然看起来有点高。格式错误的行在数据文件中,对吗?在这种情况下,准确了解文件的格式(列之间有多少空格等)非常重要。有了这些信息,你就更容易改正了,我在问题中添加了一个数据链接。如果你能看一看,那就太好了!我看了一下。我不知道太多关于这些信息,但它看起来像内容也可能被破坏。。。第四列从0-40跳到10469(如果我们像你在问题中那样连接错误分隔的数字)。这可能吗?看起来有效的列分隔符是制表符,多余的空格是空格。所以只要去掉所有的空格:
line=line.replace(“”,)
@Drago96我认为这些值是可能的,虽然看起来有点高。实际上错误是由于制表符放置不当造成的,所以如果你只是去掉空格,就会得到错误的结果。“0.1 9 0.0”应变为“0.19 0.0”,而不是“0.1 90.0”。实际上,错误是由于标签放置不当造成的,因此,如果只是删除间距,则会给出错误的结果。“0.1900.0”应该变成“0.1900.0”,而不是“0.1900.0”@Aart很高兴听到这个!祝你愉快day@Aart很高兴听到这个!祝你今天愉快