Python:通用CSV文件解析和操作

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会有什么好处吗?
  • 如何创建一个包含特定列中具有某个值的整行的列表?

在StackOverflow上,一个问题应该是一个“单一的”,范围狭窄、清晰简洁描述的问题,足够通用以使其他人受益。而冗长的叙述则不然。 - Charles Duffy
@CharlesDuffy 我写一篇“漫谈式叙述”的原因正是因为我读到的很多问题都不够清晰。 - CHM
1
当然,达到清晰度需要专注的散文;否则,会增加噪音而不是启示。 - Charles Duffy
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']

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


这个有效,谢谢。我的文件确实有标题行,但我已经知道了我感兴趣的列号。 - CHM
@CHM编辑了答案,以包括必要时跳过标题行。 - Jon Clements

1
如果我理解问题正确的话,您想在行中包含一个值,但您不知道该值在哪一列,是吗?
如果您的行是列表,则应该可以使用以下方法:
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)])

我还没有测试过这个,但如果可以的话,请让我知道。


@CHM 啊。那个吗?上面那句话?那个 是一个有用的、专注的问题描述。 - Charles Duffy
如果那个句子是你需要传达的问题实际内容?当本意被埋没在周围的散文中时,确实太长了。 - Charles Duffy
@weirdcanada,这个方法没有起作用,但是Jon Clements的答案有效。无论如何还是谢谢! - CHM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接