1

Pythonでcsvファイルを読み込もうとしています。csv ファイルには 1400 行あります。次のコマンドを使用して csv ファイルを開きました。

import csv  
import sys             
f=csv.reader(open("/Users/Brian/Desktop/timesheets_9_1to10_5small.csv","rU"),
    dialect=csv.excel_tab)

次に、ファイルをループして、次のコマンドを使用して各行から最初の名前を取得しようとしました。

for row in f:
    g=row
    s=g[0]  
    end_of_first_name=s.find(",")
    first_name=s[0:end_of_first_name]

次のエラー メッセージが表示されました。

トレースバック (最新の呼び出しは最後):
ファイル ""、3 行目、モジュール
s=g[0] の
IndexError: リスト インデックスが範囲外です

このエラー メッセージが表示される理由と修正方法を知っている人はいますか?

4

2 に答える 2

3

ユニバーサル改行モード ( ) でファイルを開かないでくださいU。代わりにバイナリ モードでファイルを開きます。

f=csv.reader(open("/Users/Brian/Desktop/timesheets_9_1to10_5small.csv","rb"),
    dialect=csv.excel_tab)

CSV は、引用符で改行を管理するなど、独自の改行処理を行います。

次に、行を でprint repr(row)出力して、期待どおりの出力が得られていることを確認します。通常の文字列表現の代わりに を使用すると、処理しているオブジェクトのタイプreprについてより多くの情報が表示され、文字列と整数 ( vs. )などの違いが強調されます。'1'1

第 3 に、コンマなどの区切り文字までの文字列の一部を選択する場合は、.split(delimiter, 1)orを使用し.partition(delimiter)[0]ます。

>>> 'John,Jack,Jill'.partition(',')[0]
'John'
于 2012-10-14T19:49:23.253 に答える
0

行と g は空のリストを指します。csvには他の問題がある可能性があるため、それが必ずしもファイル内の空の行であることを意味するかどうかはわかりません。

line_counter = 0
for row in f:
    line_counter = line_counter + 1
    g=row
    if len(g) == 0:
        print "line",line_counter,"may be empty or malformed"
        continue

または、Martijn が指摘するように、Pythonic の方法では enumerate を使用しています。

for line_counter, row in enumerate(f,start=1):
    g=row
    if len(g) == 0:
        print "line",line_counter,"may be empty or malformed"
        continue
于 2012-10-14T19:58:06.397 に答える