Python的CSV读取器和迭代

13 投票
4 回答
35411 浏览
提问于 2025-04-15 17:44

我有一个CSV文件,内容大概是这样的:

"Company, Inc.",,,,,,,,,,,,10/30/09
A/R Summary Aged Analysis Report,,,,,,,,,,,,10:35:01
All Clients,,,,,,,,,,,,USER

Client Account,Customer Name,15-Jan,16 - 30,31 - 60,61 - 90,91 - 120,120 - Over,Total,Status,Credit Limit
1000001111,CLIENT A,0,0,"3,711.32",0,0,"18,629.64","22,340.96",COD,"20,000.00"
1000002222,CLIENT B,0,0,0,"3,591.27",0,0,"3,591.27",COD,0
1000003333,CLIENT C,536.78,0,0,0,0,"11,216.60","11,753.38",COD,0
1000004444,CLIENT D,0,514.94,"3,147.45",690,0,0,"4,352.39",COD,0

Grand Total,,"139,203,856.06","84,607,749.30","110,746,640.18","58,474,379.45","52,025,869.06","292,653,734.82","737,712,228.87",,,,

不过我只想处理“Client Account...”这一行之后的内容,以及“Grand Total...”这一行之前的内容。现在我用的代码是:

inputFile = csv.reader(open(filename), dialect='excel')
records = [line for line in inputFile if line and line[0].isdigit()]

4 个回答

6

在编程中,有时候我们需要让程序在特定的条件下运行某些代码。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会执行相应的操作。

比如说,你可能想要在用户输入一个数字时,程序才进行计算。如果用户没有输入数字,程序就不做任何事情。这种情况下,我们就需要用到“条件语句”。条件语句就像是一个检查点,程序会在这里判断条件是否成立,如果成立,就执行后面的代码。

在很多编程语言中,条件语句的写法都差不多。你会看到一些关键词,比如“if”(如果)和“else”(否则)。这就像是在说:“如果这个条件成立,就做这件事;否则,就做另一件事。”

通过使用条件语句,我们可以让程序变得更加智能,能够根据不同的情况做出不同的反应。这是编程中非常重要的一部分,帮助我们控制程序的行为。

import re
import StringIO

data=re.search("Client Account[^\r\n]+[\r\n]+(.*)(?=Grand Total)",open(filename).read(),re.DOTALL).group(1)
datafile=StringIO.StringIO(data)

inputFile = csv.reader(datafile, dialect='excel')
records = [line for line in inputFile if line and line[0].isdigit()]
10

你可以这样做,通过设置一个标志

import csv
file = "file"
f=0
reader = csv.reader(open(file),delimiter=',')
for row in reader:
    if "Grand Total" in row: break
    if "Client Account" in row: f=1;continue
    if f:
        if row[0].isdigit():
            print row
12

通过生成器。你可以从简单的生成器过滤函数构建出各种复杂的功能。虽然这比你的过滤器要复杂得多,但它更灵活,能够轻松处理非常复杂的电子表格。

def skip_blank( rdr ):
    for row in rdr:
        if len(row) == 0: continue
        if all(len(col)==0 for col in row): continue
        yield row

def after_heading( text, rdr ):
    i= iter(rdr)
    for row in i:
        if any( column == text for column in row ):
            break
    for row in i:
        yield row

def before_footing( text, rdr ):
    for row in rdr:
        if any( column == text for column in row ):
            break
        yield row

def between( start, end, rdr ):
    for row in before_footing( end, after_heading( start, rdr ) ):
        yield row

for row in between( 'Grand Total', 'Client Account', skip_blank( inputFile ) ):
    print row

撰写回答