2

私はPythonを初めて使用し、ネストされた「forループ」を実装するのに問題があります。これは単純かもしれませんが、私が試した次のサンプルコードでは、意図した結果が得られません。私の仕事は、実際には、属性テーブル(ArcGIS機能データ)からレコードを読み取り、CSVファイル内のすべてのレコードと比較することです。しかし、最初は2つのCSVファイルで同じことを実行してから、元の問題に同様のロジックを適用しようとしています。ループの動作を理解しようとしています。後で比較の条件を追加できます。どんな助けでも大歓迎です。ありがとう。

ファイル1(CSV)の最初の行がファイル2(CSV)のすべての行(行ごと)と比較され、ファイル1の2番目の行がファイル1の各行がすべての行と比較されるまで同じことを行うという考え方です。ファイル2の行。したがって、予想される結果では、ファイル1のすべての行について、file2の各行が考慮されているかどうかを確認しようとしています。

例:

**File 1   File 2**
ALPHA      All
BETA       Bell
GAMMA      Cell
DELTA      Dell
ITA 

サンプルコード:

import csv, sys, os, string 
table1 = os.path.join(path, 'table1.csv')
table2 = os.path.join(path, 'table2.csv')
file1 = csv.reader(open(table1, 'r'))
file2 = csv.reader(open(table2, 'r'))
for row in file1:
    print row
    for prow in file2:
        print prow

予想される結果:

   ALPHA
    All
    Bell
    Cell
    Dell

    BETA
    All 
    …..

    ITA

All
..
Dell
4

5 に答える 5

3

ここでの問題は、それfile2が単なるワンショット iterator であることです。したがって、file2( の最初の反復でfile1) 1 回反復した後、データを完全に使い果たします。

file2代わりに、の内容をリストに保存する必要があります。

file2=list(csv.reader(open(table2,'r')))
for row in file1:
     print row
     for prow in file2:
         print prow

これにより、いくつかのリストが出力されます。すべてのリストには、それぞれの行の最初のセルである 1 つの要素のみが含まれています。これは、ファイルを CSV として解析するためです。各反復により、行内のセルのリストが取得されます。

于 2012-06-26T15:22:56.933 に答える
3

これは、csv.readerオブジェクトを反復処理すると、反復ごとに空になるためです。

file2それがイテレータがこのように振る舞う理由です。

これを回避するにはfile2、最初に値をリストに保存する必要があります。

file1=csv.reader(open(table1,’r’))
file2=list(csv.reader(open(table2, 'r'))) #edited this
for row in file1:
...     print row
...     for prow in file2:
...         print prow
于 2012-06-26T15:23:25.307 に答える
1

CSV モジュールは、ループ後に「消費」されるこれらのファイルの両方の反復子を返します。これは、ファイルに対する典型的な Python の動作です。

あるファイルの値を別のファイルのループで使用するために、それらをメモリにロードできます。あなたの意図をよく読んで、あるファイルのデータを他のファイルのすべての行に関連付けたいと思います。説明的な例を挙げます:

greek = csv.reader(open('file1.csv'))
dells = csv.reader(open('file2.csv'))

second_file_data = list(dells)

#From here, dells is "spent."  If we would want to reuse it, we have to reopen it

for line in greek:
  print line
  for other in second_file_data:
      print other
于 2012-06-26T15:22:45.370 に答える
1

これをしないでください。

最初のファイルを適切なデータ構造 (たとえば a set) に読み込み、次に 2 番目のファイルを読み込むときに、データ構造で収集された行に対してテストします。

この演習では、毎回最初のファイルから読み取ったデータ全体を出力するように見えるため、単一の文字列を作成するのが最善の方法です。

file2='\n'.join((l[0] for l in csv.reader(open(table2,’r’))))
for row in file1:
        print row
        print file2

インデントが必要な場合は、textwrapを使用して にインデントを追加できますfile2

于 2012-06-26T15:23:09.877 に答える
1

問題は、file2 のすべての行を反復処理した後、そのストリームが消費されることです。読むべきものはもう何もありません。次の for ループは csv.reader オブジェクトを再設定しませんが、すべてが既に読み取られて解析されていることを認識し、それ以上行うことはありません。

ソリューションには次のものが含まれます。

file2_stream = open(table2, 'r')
for row in file1:
  print row
  file2_stream.seek(0)  # Reset file stream position
  file2 = csv.reader(file2_stream)  # Init CSV parsing
  for prow in file2:
    print prow

または、毎回ファイルを再度開くことができます。

for row in file1:
  print row
  file2 = csv.reader(open(table2, 'r'))
  for prow in file2:
    print prow

これにより、明らかに、外側の反復ごとに 2 番目のファイルが解析されます。メモリ サイズに比べてファイルが大きくない場合は、ファイルを一度解析してから、結果をリストとしてメモリに格納します。

file2_rows = list(file2)
for row in file1:
  print row
  for prow in file2_rows:
    print prow
于 2012-06-26T15:33:45.003 に答える