Разобрать текстовый файл в python с помощью строк без кавычек - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь проанализировать длинную .txt текстовую таблицу в pd.DataFrame или любую другую читаемую форму в Python.Я успешно попробовал способ сделать это, но я не совсем доволен этим и хочу улучшить его.

Это подмножество моих .txt:

USAF   WBAN  STATION NAME                  CTRY ST CALL  LAT     LON      ELEV(M) BEGIN    END

007018 99999 WXPOD 7018                                  +00.000 +000.000 +7018.0 20110309 20130730
007026 99999 WXPOD 7026                    AF            +00.000 +000.000 +7026.0 20120713 20170822
007070 99999 WXPOD 7070                    AF            +00.000 +000.000 +7070.0 20140923 20150926
008260 99999 WXPOD8270                                   +00.000 +000.000 +0000.0 19960101 20100731
008268 99999 WXPOD8278                     AF            +32.950 +065.567 +1156.7 20100519 20120323
008307 99999 WXPOD 8318                    AF            +00.000 +000.000 +8318.0 20100421 20100421
008411 99999 XM20                                                                 20160217 20160217
008414 99999 XM18                                                                 20160216 20160217
008415 99999 XM21                                                                 20160217 20160217
008418 99999 XM24                                                                 20160217 20160217
010000 99999 BOGUS NORWAY                  NO      ENRS                           20010927 20041019
010010 99999 JAN MAYEN(NOR-NAVY)           NO      ENJA  +70.933 -008.667 +0009.0 19310101 20190203

Я попробовал следующее:

Тест 1 : используйте re дляразберите пробелы:

with open('test.txt') as f:
   lines = f.readlines()
   parsed_lines = [re.split("\s+", line) for line in lines]
print(test)

['007018',
 '99999',
 'WXPOD',
 '7018',
 '+00.000',
 '+000.000',
 '+7018.0',
 '20110309',
 '20130730',
 '']

Что означает ок , но далеко от оптимального, название станции разделено на другой элемент списка, который показывает только мои плохие способности regex.

Тест 2: Используйте строковые позиции:

with open('/Users/ivan/weather_isd_noaa/data/isd-history.txt') as f:
    lines = f.readlines()

    colum_names = lines[0]
    usaf_code = []
    wban = []
    station_name = []
    country = []
    us_state = []
    call = []
    lat = []
    lon = []
    elevation = []
    begin = []
    end = []

    for line in lines:
        usaf_code.append(line[:6])
        wban.append(line[7:12])
        station_name.append(line[13:43])
        country.append(line[43:45])
        us_state.append(line[46:50])
        call.append(line[51:55])
        call.append(line[57:64])
        lat.append(line[57:64])
        lon.append(line[56:73])
        elevation.append(line[74:81])
        begin.append(line[82:90])
        end.append(line[91:100])

    df = pd.DataFrame({
        'usaf_code': usaf_code,
        'wban': wban,
        'station_name': station_name,
        'country': country,
        'us_state': us_state,
        'lat': lat,
        'lon': lon,
        'elevation': elevation,
        'begin': begin,
        'end': end
    })

Что дает хороший pd.DataFrame, который довольно легко чистить.Это хороший подход, но я уверен, что он не очень хороший, есть способ улучшить эту функцию?Я хочу, чтобы этот код был безупречен, и я не доверяю этим жестко закодированным позициям.

Я знаю, что некоторые инструменты, такие как sed или awk, чрезвычайно полезны, но сейчас я могу запускать только Python на этом;Конечно, subprocess может сделать трюк, но я хочу положиться на Python для этого.

1 Ответ

0 голосов
/ 09 февраля 2019

Имо, это определенно выглядит как формат с фиксированной шириной, то есть каждый столбец имеет свое собственное, фиксированное количество символов.

Итак, в чем проблема, вы должны попробовать pd.read_fwf().
https://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.read_fwf.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...