web-dev-qa-db-ja.com

属性エラー:「リスト」オブジェクトには属性「分割」がありません

ファイルを読み取って、各行のセルをコンマで分割し、緯度と経度に関する情報を含む最初と2番目のセルのみを表示しようとしています。これはファイルです:

時間、緯度、経度、type2015-03-20T10:20:35.890Z、8.8221664、-122.7649994、earthquake2015-03-20T10:18:13.070Z、.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'オブジェクトには属性 'split'がありません

私を助けてください!

9
loveTrumpsHate

ここで実際にあなたはより広い混乱を持っていると思います。

最初のエラーは、行のリスト全体でsplitを呼び出そうとしていることです。splitは文字列のリストではなく、文字列のみです。そのため、すべてではなく、split各行にする必要があります。

そして、あなたはfor points in Type、およびそれぞれのpointsが新しいxおよびyを提供することを期待しています。しかし、それは起こりません。 Typesxyの2つの値であるため、最初のpointsxになり、次にポイントはy、それで完了です。そのため、各行をループして、単一のxをループするのではなく、各行からyおよびTypes値を取得する必要があります。単一の行から。

そのため、すべてがファイル内のすべての行でループ内に入り、splitxyに1行ごとに1回実行する必要があります。このような:

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を見てください。これらのライブラリは、doを使用して、データの配列全体またはフレーム全体に機能をほぼ同じ方法で暗黙的にマッピングする方法を提供します。

13
abarnert

問題は、readlinesが文字列のリストであり、それぞれがfilenameの行であるということです。おそらくあなたは:

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