2017-01-25 37 views
0

私はPythonで完全なnoobですので、解決策が明らかであれば謝ります。 私は、処理のためにいくつかの.csvフィールドのデータをPython上で読み込もうとしています。現在、私は持っている:Pythonでフッタ行の長さが異なる.csvファイルを読む

data = pd.read_csv('somedata.csv', sep=' |,', engine='python', usecols=(range(0,10)), skiprows=155, skipfooter=3) 

しかしデータ収集が中断された場合は、ファイルの最後の数行のようなものかもしれ依存:

コンプリート

#data_end

ラン

または

実行し

ERROR

は、したがって、私はちょうどskipfooter = 3を使用できないエラーコードの束を中断しました。 Pythonがフッターの長さを検出してスキップする方法はありますか?ありがとうございました。

答えて

1

ファイルの内容をプレーンテキストファイルとしてPythonリストに読み込み、予想されるセパレータの数が含まれていない行を削除して、そのリストをIOストリームに変換することができます。このIOストリームは、あたかもそれがファイルオブジェクトであるかのようにpd.read_csvに渡されます。

コードは次のようになります。あなたは、Python 2.7を使用している場合

from io import StringIO 
import pandas as pd 

# adjust these variables to meet your requirements: 
number_of_columns = 11 
separator = " |, " 

# read the content of the file as plain text: 
with open("somedata.csv", "r") as infile: 
    raw = infile.readlines() 

# drop the rows that don't contain the expected number of separators: 
raw = [x for x in raw if x.count(separator) == number_of_columns] 

# turn the list into an IO stream (after joining the rows into a big string): 
stream = StringIO("".join(raw)) 

# pass the string as an argument to pd.read_csv(): 
df = pd.read_csv(stream, sep=separator, engine='python', 
       usecols=(range(0,10)), skiprows=155) 

は、次の2つのラインで最初の行from io import StringIOを置き換える行う必要があります。これは

from __future__ import unicode_literals 
from cStringIO import StringIO 

ので理由StringIOはユニコード文字列(Python 2.7ではデフォルトではない)を必要とし、StringIOクラスはPython 2.7の別のモジュールに存在するためです。

+0

ありがとうございます! – Raku

0

私は、各行のコンマを数え、手動で最後の正しいものを見つけることに頼らなければならないと思います。私はそれを自動化するread_csvのパラメータを認識していません。

関連する問題