2017-05-07 10 views
0

csvファイルを解析する必要があります。csv他の列に対応する列を読み取る値

入力:ファイル+名前

Index | writer | year | words 
    0  | Philip | 1994 | this is first row 
    1  | Heinz | 2000 | python is wonderful (new line) second line 
    2  | Thomas | 1993 | i don't like this 
    3  | Heinz | 1898 | this is another row 
    .  |  .  | . |  . 
    .  |  .  | . |  . 
    N  | Fritz | 2014 | i hate man united 

出力:私が試してみました何

l = ['python is wonderful second line', 'this is another row'] 

を名に対応するすべての単語のリスト?

import csv 
import sys 

class artist: 
    def __init__(self, name, file): 
     self.file = file 
     self.name = name 
     self.list = [] 

    def extractText(self): 
     with open(self.file, 'rb') as f: 
      reader = csv.reader(f) 
      temp = list(reader) 
     k = len(temp) 
     for i in range(1, k): 
      s = temp[i] 
      if s[1] == self.name: 
       self.list.append(str(s[3])) 


if __name__ == '__main__': 
    # arguements 
    inputFile = str(sys.argv[1]) 
    Heinz = artist('Heinz', inputFile) 
    Heinz.extractText() 
    print(Heinz.list) 

出力は次のとおりです。

["python is wonderful\r\nsecond line", 'this is another row'] 

は、どのように私は言葉の複数行が含まれているセルの\r\nを取り除くか、およびループは、その非常に遅いように改善されるだろうか?

答えて

1

これは、ファイルを読み込んでいるときに解析してから、不要な改行文字と改行文字があれば削除するので、少なくとも高速でなければなりません。

with open(self.file) as csv_fh: 
    for n in csv.reader(csv_fh): 
     if n[1] == self.name: 
      self.list.append(n[3].replace('\r\n', ' ') 
1

あなたは、単にリストを取得するためにパンダを使用することができます。

import pandas 
df = pandas.read_csv('test1.csv') 
index = df[df['writer'] == "Heinz"].index.tolist() # get the specific name's index 
l = list() 
for i in index: 
    l.append(df.iloc[i, 3].replace('\n','')) # get the cell and strip new line '\n', append to list. 
l 

出力:

['python is wonderful second line', 'this is another row'] 
+0

私が欲しいものではありません。私は特定の作家/アーティストの言葉が必要です。すべての単語ではありません。 –

+0

@TonyTannous特定の作家の答えを更新しました。 –

1

s[3]に改行退治:私は' '.join(s[3].splitlines())をお勧めしたいです。 "".splitlinesのドキュメントを参照してください。"".translateも参照してください。

ループの改善:

def extractText(self): 
    with open(self.file, 'rb') as f: 
     for s in csv.reader(f): 
      s = temp[i] 
      if s[1] == self.name: 
       self.list.append(str(s[3])) 

これは、データの上で1つのパスが保存されます。

しかし、@ Tiny.Dのアドバイスを考えて、パンダに試してみてください。

+0

しかし、私はいくつかの行を削除する前に、各オブジェクトにテキスト全体を保持する必要があります。私はしない?私はそれらのすべてではなく、特定の言葉が必要です。 –

+0

元のコードは、すべてのファイルの内容を 'temp = list(reader)'にメモリにコピーします。ここで各行はs [1] == self.name;ほとんどの行は破棄されます。 – tiwo

0

あなたは正規表現を使用することができ、そして少し物事をスピードアップするために、ループの理解を試みる複数の空白を折りたたむには:

import re 

def extractText(self): 
    RE_WHITESPACE = re.compile(r'[ \t\r\n]+') 
    with open(self.file, 'rU') as f: 
     reader = csv.reader(f) 

     # skip the first line 
     next(reader) 

     # put all of the words into a list if the artist matches 
     self.list = [RE_WHITESPACE.sub(' ', s[3]) 
        for s in reader if s[1] == self.name] 
関連する問題