属性错误:'list'对象没有'split'属性。

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

时间,纬度,经度,类型2015-03-20T10:20:35.890Z,38.8221664,-122.7649994 ,地震 2015-03-20T10:18:13.070Z,33.2073333,-116.6891667 ,地震 2015-03-20T10:15:09.000Z,62.242,-150.8769 ,地震

我的程序:
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'

请帮助我!


2
因为list没有split()方法,只有string对象才有split方法。 - letsc
3
readlines() 返回一个 list。你需要对该 list 中的每个字符串使用 split() 函数。 - TigerhawkT3
仔细阅读错误信息。您正在尝试拆分readlines,它是一个列表。这是不可能的。 - Loocid
你为什么要使用readlines呢?如果你只想要第一行作为一个字符串,那就用readline。如果你想要整个文件作为一个巨大的字符串,那就用read。如果你想要一个行的列表或其他可迭代对象,你可以使用readlines,但你也可以直接使用文件本身,所以它还是没有用处的。 - abarnert
1
作为附注,您可能想考虑在这里使用 csv 模块。特别是如果有一个标题行的话;那么您可以使用 for row in csv.DictReader(readfile): 然后您的值是 row['latitude']row['longitude'] 而不是 row[1]row[2],这可能更易读一些。 - abarnert
3个回答

33

我认为你这里存在一个更广泛的混淆。

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

然后你正在执行for points in Type,并期望每个points都给你一个新的xy。但那是不可能的。Types只有两个值,xy,因此第一个points将是x,然后点将是y,然后你就完了。所以,你需要循环遍历每一行,并从每一行中获取xy的值,而不是在单个Types和单行上循环。

所以,所有东西都必须放在对文件中的每一行进行循环的内部,并针对每一行执行一次split,将其划分为xy。像这样:

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()
作为附注,你真的应该使用 `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。这些库提供了一种隐式映射功能的方式,几乎与您尝试的方式相同地将功能映射到整个数组或数据框架上。



2
问题在于readlines返回的是一个字符串列表,每个字符串都代表文件filename的一行。也许你想要使用以下代码:
for line in readlines:
    Type = line.split(",")
    x = Type[1]
    y = Type[2]
    print(x,y)

0

我所做的是通过将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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接