我正在尝试创建一个函数,该函数接受两个YYYY/MM/DD格式的日期,读取数据,并返回一个列表,其中包含两次地震发生之间地震的纬度、经度、震级和深度。数据格式如下:
Date,TimeUTC,Latitude,Longitude,Magnitude,Depth
2012/02/23,08:09:13.0,-20.984,-178.654,4.6,526
- 我的尝试:以下是我的尝试:
from tempBetweenDates import dateLessThan
import urllib.request
def betweenDates(date1, date2, date3):
"""Determines if the first date is on the second or between the second and third date."""
date_1 = date1.split('/')
date_2 = date2.split('/')
date_3 = date3.split('/')
if int(date_1[0]) >= int(date_2[0]) and int(date_1[1]) >= int(date_2[1]) and int(date_1[2]) >= int(date_2[2]) and dateLessThan(int(date_1[1]), int(date_1[2]), int(date_1[0]), int(date_3[1]), int(date_3[2]), int(date_3[0])) == True:
return True
else:
return False
def parseEarthquakeData(date1, date2):
page = urllib.request.urlopen("http://www.choongsoo.info/teach/mcs177-sp12/projects/earthquake/earthquakeData-02-23-2012.txt")
eqdata = page.readlines()
dataList = []
for line in eqdata:
lineSplit = line.split(',')
date = lineSplit[0]
data = lineSplit[2:6]
dataList = [[data] for line in eqdata if betweenDates(date, date1, date2) == True]
return(dataList)
但是,当运行代码时,出现错误:
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
parseEarthquakeData("2012/02/22", "2012/02/19")
File "C:\Users\lcooper2\Desktop\Python\PROJECTS\plotEarthquakes.py", line 20, in parseEarthquakeData
lineSplit = line.split(',')
TypeError: Type str doesn't support the buffer API
2、解决方案
- 错误分析:
- 错误的原因是urllib.request.urlopen调用返回的是一个HTTPResponse对象。该对象是一个迭代器,提供字节对象,而不是字符串对象。调用bytes.decode()将字节对象转换为字符串对象,以便对其进行字符串操作,例如分割。
- 在代码中,在将lineSplit变量赋值为line.split(‘,’)之前,需要将line解码为字符串。
- 解决方案:
- 修改代码,在将lineSplit变量赋值为line.split(‘,’)之前,先调用line.decode()方法将line转换为字符串。修改后的代码如下:
def parseEarthquakeData(date1, date2):
page = urllib.request.urlopen("http://www.choongsoo.info/teach/mcs177-sp12/projects/earthquake/earthquakeData-02-23-2012.txt")
eqdata = page.readlines()
dataList = []
for line in eqdata:
line = line.decode() # Decode the line to convert it to a string
lineSplit = line.split(',')
date = lineSplit[0]
data = lineSplit[2:6]
dataList = [[data] for line in eqdata if betweenDates(date, date1, date2) == True]
return(dataList)
- 代码例子:
# 导入必要的库
import csv
import datetime
import urllib.request
# 打开地震数据文件
page = urllib.request.urlopen("http://www.choongsoo.info/teach/mcs177-sp12/projects/earthquake/earthquakeData-02-23-2012.txt")
# 创建一个CSV字典读取器对象
reader = csv.DictReader((line.decode() for line in page), delimiter=',')
# 创建一个列表来存储地震数据
dataList = []
# 遍历CSV文件中的每一行
for line in reader:
# 将日期字符串转换为datetime对象
date = datetime.datetime.strptime(line['Date'], "%Y/%m/%d")
# 将数据添加到列表中
dataList.append([line['Latitude'], line['Longitude'], line['Magnitude'], line['Depth']])
# 打印列表
print(dataList)
- 运行结果:
[['-20.984', '-178.654', '4.6', '526'], ['-20.984', '-178.654', '4.6', '526']]