3

私のPythonスクリプトの目的は、複数のCSVファイルに存在するデータを比較して、不一致を探すことです。データは順序付けられていますが、ファイルごとに順序が異なります。ファイルには約70K行が含まれ、重量は約15MBです。ここには派手なものやハードコアなものはありません。コードの一部は次のとおりです。

def getCSV(fpath):
    with open(fpath,"rb") as f:
        csvfile = csv.reader(f)

        for row in csvfile:
            allRows.append(row)

allCols = map(list, zip(*allRows))
  • CSVファイルから正しく読み取っていますか?私はを使用しcsv.readerていますが、使用することでメリットがありcsv.DictReaderますか?
  • 正確な列に特定の値を持つ行全体を含むリストを作成するにはどうすればよいですか?
4

3 に答える 3

2

これは機能するはずです。列にアクセスするために別のリストを作成する必要はありません。

import csv
import sys

def getCSV(fpath):
    with open(fpath) as ifile:
        csvfile = csv.reader(ifile)

        rows = list(csvfile)

    value_20 = [x for x in rows if x[20] == 'value']
于 2012-07-19T23:17:52.713 に答える
2

すべての行を維持してもよろしいですか?これにより、一致する値のみを含むリストが作成されます...または、またはその他のデータソースfnameから取得することもできます。ちなみに、あなたは20番目の列について言及していますが、row[20]は21番目の列になります...glob.glob()os.listdir()

import csv

matching20 = []

for fname in ('file1.csv', 'file2.csv', 'file3.csv'):
    with open(fname) as fin:
        csvin = csv.reader(fin)
        next(csvin) # <--- if you want to skip header row
        for row in csvin:
            if row[20] == 'value':
                matching20.append(row) # or do something with it here

csv.DictReaderヘッダー行があり、名前で列にアクセスする場合にのみ必要です。

于 2012-07-19T23:29:28.737 に答える
1

私が質問を正しく理解している場合、行にある場合は行を含めたいのですが、どの列が正しいかvalueわかりませんか?value

行がリストの場合、これは機能するはずです。

testlist = [row for row in allRows if 'value' in row]

ポストエディット:

あなたが言うようにvalue、指定された列(整数で指定された)にある行のリストが必要な場合は、次のようになりますpos

testlist = []
pos = 20
for row in allRows:
    testlist.append([element if index != pos else 'value' for index, element in enumerate(row)])

(私はこれをテストしていませんが、それが機能する場合は今すぐさせてください)。

于 2012-07-19T23:08:49.677 に答える