2017-08-23 26 views
0

私はPythonが初めてです。私は、ファイルを開く簡単なスクリプトを書いて、関数によって、行の一部をgeneratorオブジェクトに追加します。次に、このオブジェクトを使用して、別のファイルとの違いを同じようにします。私はdifflibを使用してい違いを作るためのPython difflibリストの仕組みは?

unhashable type: 'list'.

:私は、次のエラーを得ました。

なぜこのエラーが発生するのか説明してください。私はdifflibf.readlines()と一緒に使用する方法を見てきましたが、f.readlines()もリストを返すので、私はそれを取得しません。

#! /usr/bin/python 

import difflib 

def lineExtractor(file): 
    lines = [] 
    for line in file: 
     if line.startswith('g'): 
      if lines: 
       yield lines 
       lines = [] 
     else: 
      lines.append(line) 
    if lines: 
     yield lines 

with open('testfile1.txt') as file1: 
    lines1 = lineExtractor(file1) 
    with open('testfile2.txt') as file2: 
     lines2 = lineExtractor(file2) 
     for line in difflib.unified_diff(lines1, lines2, fromfile='file1', tofile='file2', lineterm='', n=0): 
       print line 

おかげ

+1

"リストを返す" - 何のリスト? lineExtractorは何をしますか? –

+0

入力ファイルを1行ずつ処理します。行が 'g'で始まらない場合、行を '行'オブジェクトに追加します。したがって、基本的に 'g'で始まるevey行をフィルタリングします – Minee

+0

'lineExtractor'は文字列のリストのようなものを返します。これは単に 'g'で始まる行をフィルタリングすること以上のものです。文字列のリストを返すだけですか? –

答えて

0

問題はunified_diffは、入力として文字列のリストを必要としていることです。あなたは代わりにそれを発電機にしています。そしてこのジェネレータは文字列を生成しません。文字列のリストを生成します。

まず、

lines1 = lineExtractor(file1) 

lines1 = list(lineExtractor(file1)) 

はもちろん、同じことが lines2で行われる必要がある次のようになります。

は、だから我々は2つの変更を加える必要があります。

第二に、

yield lines 

yield ''.join(lines)になります。

+0

実際にはyieldを変更すると、文字列のリストの代わりに文字列のリストが生成されますか? – Minee

+0

@MManuelはい、 ''' .join(lines)'は文字列 'lines'のリストを文字列に変換します。そして、 'list(lineExtractor(file1))'はジェネレータをリストに変換します。結果は 'unified_diff'に渡すことができる文字列のリストです。 –

+0

説明をありがとうございました。だから私は最終的にメモリがそれのために予約されるので、私は最終的にリストにジェネレータを変換するようにそれは本当にジェネレータを使用する意味がありません。私は正しい? – Minee