1. ホーム
  2. python

[解決済み】属性エラー:'list'オブジェクトに'split'属性がない

2022-01-27 14:25:49

質問

あるファイルを読み込んで、各行のセルをカンマで分割し、緯度と経度の情報を含む1番目と2番目のセルだけを表示しようとしています。 これがそのファイルです。

<ブロッククオート

時間 緯度,経度 ,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 地震

私のプログラム

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:「リスト」オブジェクトは「スプリット」属性を持ちません。

助けてください!

どのように解決するのですか?

実は、もっと広い範囲で混乱が起きているのだと思います。

最初のエラーは、あなたが split を行の全リストに適用することはできません。 split は文字列のリストであり、文字列のみです。だから、あなたは split 各行 のように、全体ではなく

そして、あなたがやっているのは for points in Type で、そのような各 points を与えると、新しい xy . でも、そうはいかないんです。 Types は2つの値だけです。 xy ということで、まず pointsx となり、ポイントは y で、終了です。つまり、繰り返しになりますが、各行でループして xy の値は 各行 をループさせるのではなく、1つの Types を1行から削除します。

そのため、ファイル内のすべての行をループして、その中で splitxy を各行ごとに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 を見てみましょう。 する は、あなたがやろうとしていたのとほとんど同じ方法で、データの配列やフレーム全体に対して暗黙的に機能をマッピングする方法を提供します。