我在Python Crash Course中跟蹤一個項目,演示如何使用CSV文件。下面的代碼成功地填充了dates
列表,我認爲它是datetime
對象。例如,這是dates
列表的第一個元素:datetime.datetime(2014, 1, 1, 0, 0)
。下面是功能代碼:Python 3:datetime.strptime()返回一個整數列表而不是字符串
import csv
from datetime import datetime
filename = 'sitka_weather_2014.csv'
with open(filename) as f:
reader = csv.reader(f)
# Move onto the next row as the first contains no data
next(reader)
dates = []
for row in reader:
try:
date = datetime.strptime(row[0], "%Y-%m-%d")
except ValueError:
print(date, "missing data")
else:
dates.append(date)
print(dates[0])
這段代碼的輸出是:2014-01-01 00:00:00
現在,我想實施這個項目與幾個不同的文件,而且具有面向對象的設計原則練習。我設置了父類WeatherData
,它有兩個屬性:一個名爲data
的列表和一個名爲filename
的字符串。 WeatherData
類將使用CSV文件中的特定列填充data
列表。接下來,我創建了一個名爲WeatherLocation
的子類,它從WeatherData
繼承。 WeatherLocation
有三個屬性:
- 列表稱爲
highs
存儲最高溫度 - 列表叫
lows
存儲在低溫下 - 稱爲
dates
列表存儲日期
如果我們看的set_data
方法,我們將看到與上述代碼相同的邏輯被實現。當調用set_dates
方法WeatherLocation
時,傳遞相同的行號,並且fetching_dates
設置爲True
,因此執行if語句的正確部分。代碼如下所示:
import csv
import os.path
from datetime import datetime
class WeatherData:
def __init__(self, filename):
self.data = []
self.filename = self.give_file(filename)
def give_file(self, filename):
"""Method checks for existence of file before setting the 'filename'
attribute to the argument
"""
if not os.path.isfile(filename):
print("The file " + filename + " could not be found")
else:
return filename
def set_data(self, row_number, fetching_dates=False):
"""Sets the data attribute to a list of data selected by the program"""
if not self.filename:
print("You must call give_file() and provide it a filename"
+ " before calling this method")
with open(self.filename) as f:
reader = csv.reader(f)
# Call next method so we can skip the header_column and get
# into the data
next(reader)
for row in reader:
if fetching_dates:
try:
date = datetime.strptime(row[row_number], "%Y-%m-%d")
except ValueError:
print(date, "missing data")
else:
self.data.append(date)
else:
try:
datum = int(row[row_number].strip())
except ValueError:
print(datum, "missing data")
else:
self.data.append(datum)
def get_data(self):
return self.data
class WeatherLocation(WeatherData):
def __init__(self, filename):
super().__init__(filename)
self.highs = self.set_highs()
self.lows = self.set_lows()
self.dates = self.set_dates()
def set_highs(self):
super().set_data(1)
return super().get_data()
def set_lows(self):
super().set_data(3)
return super().get_data()
def set_dates(self):
super().set_data(row_number=0, fetching_dates=True)
return super().get_data()
sitka = WeatherLocation('sitka_weather_2014.csv')
print(sitka.dates[0])
不幸的是,該代碼的輸出是46
。我究竟做錯了什麼?
同樣的變量名'row_number'會像'column_number'更好,只要你'print'的錯誤信息,你應該提出一個合適的異常,而不是。 –
當您在超類中調用具有相同name_的方法時,您只需使用'super()'。所以'super()。set_data(3)'可以用'this.set_data(3)'替換,等等。您需要'super()'的代碼中的唯一位置在'__init __()'方法中。 –