Python中分隔逗号分隔的数据并创建列表

我正在尝试创建一个函数,该函数接受两个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']]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值