1

私は、いくつかのcsvファイルを操作しようとしている絶対的なプログラミング初心者です。私が全体的にやろうとしていることはもっと複雑ですが、私は現在この問題に固執しています:

私が持っているcsvファイルには、固定数の「列」と可変数の行が含まれています。私がやりたいのは、ディレクトリ内の各csvファイルを開き、メモリ内にファイル値を2Dリストに格納してから、そのリストからデータの1つの「列」をプルすることです。これをループで行うことで、各csvファイルのデータの1列を含むリストを追加できます。

単一のファイルに対してこれを行うと、次のように機能します。

csvFile = 'testdata.csv'
currentFile = csv.reader(open(csvFile), delimiter=';')
errorValues = []

    for data in currentFile:

        rows = [r for r in currentFile] #Store current csv file into a 2d list           
        errorColumn = [row[34] for row in rows] #Get position 34 of each row in 2D list
        errorColumn = filter(None, errorColumn) #Filter out empty strings
        errorValues.append(errorColumn) #Append one 'column' of data to overall list

ディレクトリ内のすべてのファイルに対してループしようとすると、「リストインデックスが範囲外です」というエラーが発生します。

dirListing = os.listdir(os.getcwd())    
errorValues = []

for dataFile in dirListing:
    currentFile = csv.reader(open(dataFile), delimiter=';')        

    for data in currentFile:

        rows = [r for r in currentFile] #Store current csv file into a 2d list           
        errorColumn = [row[34] for row in rows] #Get position 34 of each row in 2D list
        errorColumn = filter(None, errorColumn) #Filter out empty strings
        errorValues.append(errorColumn) #Append one 'column' of data to overall list

    errorColumn = [] #Clear out errorColumn for next iteration

エラーは'errorColumn= [row [34] for rowinrows]'で発生します。私はこれを行うためにあらゆる種類の方法を試しましたが、常に範囲外のインデックスエラーに失敗しました。作業スクリプトを使用して1つずつテストしたので、csvファイルに問題はありません。何が問題なのですか?

助けてくれてありがとう。

4

2 に答える 2

2

あなたが言及したエラーがにあることに少し驚いています[r for r in currentFile]。最悪の場合、あなたのrowsリストは空になります...

すべての行に少なくとも35列あることを100%確信していますか?どこかに空の行がないということですか?最後に?確認する価値があるかどうか

errorColumn = [row[34] for row in rows if row]

それでもエラーが発生します。あなたが最初にラインを取り除いたという条件でfor data in currentFile(あなたは使用せず、より重要なのはあなたを消費し、あなたcurrentFileに残しますrows==[]

于 2012-09-17T15:49:35.207 に答える
1

ループはCSVファイルのfor行を通過します。各行は、リーダーによって要素の行に変換されます。このようにdata、ループ内はすでに行になっています。次の構成も、開いているファイルを繰り返し処理します。これは間違っています。

に問題がありますopen()。ファイルはバイナリモードで開く必要があります(Python 2の場合)。

次のことを試してください(私はあなたが望むすべてを中に入れませんでした):

dirListing = os.listdir(os.getcwd())    
errorValues = []

rows = []                  # empty array of rows initially

for fname in dirListing:
    f = open(fname, 'rb')  # open in binary mode (see the doc)
    reader = csv.reader(f, delimiter=';')        

    errorColumn = []       # initialized for the file

    for row in reader:
        rows.append(row) #Store current csv file into a 2d list           
        if len(row) > 34:
            errorColumn.append(row[34]) #Get position 34 of each row in 2D list

    errorValues.append(errorColumn)

    f.close()              # you should always close your files

注意してください!サブディレクトリのos.listdir()名前も返します。追加してみてください

if os.path.isfile(fname):
    ...

ちなみに、あなたはあなたの実際の目標が何であるかを明確に説明する必要があります。それを解決するためのより良い方法があるかもしれません。あなたは最初に頭に浮かんだ解決策に精神的に固定されているかもしれません。このメディアを活用して、解決策を提案するための目と頭を増やしてください。

于 2012-09-17T15:56:40.163 に答える