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也可能来自您glob.glob()选择os.listdir()的任何其他数据源。请注意,您提到第 20 列,但 row[20] 将是第 21 列...

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在指定列中的行列表(由 integer 指定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 回答