Attribute Error: 'list' object has no attribute 'split'

Attribute Error: 'list' object has no attribute 'split'

我正在尝试读取一个文件并在每行中用逗号分隔一个单元格,然后仅显示包含有关纬度和经度的信息的第一个和第二个单元格。 这是文件:

time,latitude,longitude,type2015-03-20T10:20:35.890Z,38.8221664,-122.7649994,earthquake2015-03-20T10:18:13.070Z,33.2073333,-116.6891667,earthquake2015-03-20T10:15:09.000Z,62.242,-150.8769,earthquake

我的程序:

def getQuakeData():
    filename = input("Please enter the quake file: ")
    readfile = open(filename, "r")
    readlines = readfile.readlines()

    Type = readlines.split(",")
    x = Type[1]
    y = Type[2]
    for points in Type:
        print(x,y)
getQuakeData()

当我尝试执行这个程序时,它给我一个错误

"AttributeError: 'list' object has no attribute 'split'

请帮帮我!

问题是readlines是一个字符串列表,每个字符串都是filename的一行。也许你的意思是:

for line in readlines:
    Type = line.split(",")
    x = Type[1]
    y = Type[2]
    print(x,y)

我认为你实际上在这里有更广泛的困惑。

最初的错误是您试图在整个行列表上调用 split,而您不能 split 字符串列表,只能是一个字符串。所以,你需要 split 每行 ,而不是全部。

然后你在做 for points in Type,并期待每个这样的 points 给你一个新的 xy。但那不会发生。 Types只是两个值,xy,所以首先points将是x,然后点将是y,然后你会完成的。因此,同样,您需要遍历每一行并从 每行 中获取 xy 值,而不是遍历单个 Types来自一行。

因此,所有内容都必须进入文件中每一行的循环,并对每一行执行一次 splitxy 一次。像这样:

def getQuakeData():
    filename = input("Please enter the quake file: ")
    readfile = open(filename, "r")

    for line in readfile:
        Type = line.split(",")
        x = Type[1]
        y = Type[2]
        print(x,y)

getQuakeData()

作为旁注,您确实应该 close 文件,最好带有 with 语句,但我会在最后谈到它。


有趣的是,这里的问题不是你太新手了,而是你正试图以与专家相同的抽象方式解决问题,只是不知道细节呢。这是完全可行的;您只需要明确地映射功能,而不是隐式地进行。像这样:

def getQuakeData():
    filename = input("Please enter the quake file: ")
    readfile = open(filename, "r")
    readlines = readfile.readlines()
    Types = [line.split(",") for line in readlines]
    xs = [Type[1] for Type in Types]
    ys = [Type[2] for Type in Types]
    for x, y in zip(xs, ys):
        print(x,y)

getQuakeData()

或者,更好的写法可能是:

def getQuakeData():
    filename = input("Please enter the quake file: ")
    # Use with to make sure the file gets closed
    with open(filename, "r") as readfile:
        # no need for readlines; the file is already an iterable of lines
        # also, using generator expressions means no extra copies
        types = (line.split(",") for line in readfile)
        # iterate tuples, instead of two separate iterables, so no need for zip
        xys = ((type[1], type[2]) for type in types)
        for x, y in xys:
            print(x,y)

getQuakeData()

最后,您可能想看看 NumPy 和 Pandas 库,它们 为您提供了一种在整个数组或框架上隐式映射功能的方法数据几乎与您尝试的方式相同。

我所做的是通过将 readlines 转换为字符串来快速修复,但我没有重新开始它,但它有效而且我不知道是否存在限制

`def getQuakeData():
    filename = input("Please enter the quake file: ")
    readfile = open(filename, "r")
    readlines = str(readfile.readlines())

    Type = readlines.split(",")
    x = Type[1]
    y = Type[2]
    for points in Type:
        print(x,y)
getQuakeData()`