Очистка текстового файла для экспорта в CSV - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь очистить текстовый файл от URL, используя pandas, и моя идея состоит в том, чтобы разбить его на отдельные столбцы, добавить еще 3 столбца и экспортировать в csv.

Я попытался очиститьфайл (я считаю, что он разделяется на "") и пока безрезультатно.

# script to check and clean text file for 'aberporth' station
import pandas as pd
import requests

# api-endpoint for current weather
URLH = "https://www.metoffice.gov.uk/pub/data/weather/uk/climate/stationdata/aberporthdata.txt"

with requests.session() as s:
    # sending get for histroy text file
    r = s.get(URLH)
    df1 = pd.read_csv(io.StringIO(r.text), sep=" ", skiprows=5, error_bad_lines=False)
    df2 = pd.read_csv(io.StringIO(r.text), nrows=1)
    # df1['location'] = df2.columns.values[0]
    # _, lat, _, lon = df2.index[0][1].split()
    # df1['lat'], df1['lon'] = lat, lon
    df1.dropna(how='all')
    df1.to_csv('Aberporth.txt', sep='|', index=True)

Хуже всего то, что сам файл имеет неровные столбцы, и где-то внизу строки 944 добавляется еще один столбец, для которого я пропускаю ошибки в плохих строках.В этот момент я немного растерялся относительно того, как мне следует поступить, и стоит ли мне смотреть на что-то еще, кроме Панд.

1 Ответ

1 голос
/ 09 июля 2019

Вам не нужны панды для этого. Встроенный модуль csv прекрасно работает.

Данные поступают в формате фиксированной ширины (который отличается от «формата с разделителями»):

Aberporth
Location: 224100E 252100N, Lat 52.139 Lon -4.570, 133 metres amsl
Estimated data is marked with a * after the value.
Missing data (more than 2 days missing in month) is marked by  ---.
Sunshine data taken from an automatic Kipp & Zonen sensor marked with a #, otherwise sunshine data taken from a Campbell Stokes recorder.
   yyyy  mm   tmax    tmin      af    rain     sun
              degC    degC    days      mm   hours
   1942   2    4.2    -0.6    ---     13.8    80.3
   1942   3    9.7     3.7    ---     58.0   117.9
   ...

Таким образом, мы можем либо разделить его по заранее определенным индексам (которые мы должны были бы подсчитать и жестко закодировать, и которые, вероятно, могут быть изменены), либо мы можем разделить на «несколько пробелов» с помощью регулярных выражений, и в этом случае это происходит не имеет значения, где находятся точные позиции столбцов:

import requests
import re
import csv

def get_values(url):
    resp = requests.get(url)

    for line in resp.text.splitlines():
        values = re.split("\s+", line.strip())

        # skip all lines that do not have a year as first item
        if not re.match("^\d{4}$", values[0]):
            continue

        # replace all '---' by None
        values = [None if v == '---' else v for v in values]
        yield values



url = "https://www.metoffice.gov.uk/pub/data/weather/uk/climate/stationdata/aberporthdata.txt"

with open('out.csv', 'w', encoding='utf8', newline='') as f:
    writer = csv.writer(f)    
    writer.writerows(get_values(url))

Вы можете сделать writer.writerow(['yyyy','mm','tmax','tmin','af','rain','sun']), чтобы получить строку заголовка, если она вам нужна.

...