Вам не нужны панды для этого. Встроенный модуль 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'])
, чтобы получить строку заголовка, если она вам нужна.