【问题标题】:python iterate over csv with blank linespython用空行遍历csv
【发布时间】:2017-01-18 00:31:00
【问题描述】:

我有一个看起来像这样的 csv

文件.csv

"File is","NameofFileA"
"randomdata","1" <-- size of file
"randomdata","32"
"randomdata","43"
 <---->[this is a blank line found in the file]
"File is","NameofFileB"
"randomdata","4" 
"randomdata","3"
"randomdata","1"

所以我想做的就是得到一个这样的列表

NameofFileA Total = 73
NameofFileB Total = 8
...
..
.

我想出了如何从第 2 列(行 [1])最后一列中获取总数,但它没有按 NameofFileX 对其进行排序:

with open(csvInput,"r") as inputFile, open(csvOutput ,"w") as outputFile:
    data = csv.reader(inputFile, delimiter=',', quotechar='"')
    total = 0
    headerline = inputFile.next()
    for row in data:
        print ', '.join(row)
        total += int(row[1])
    print total

问题: 如何以 Python 的方式说“将 NameofFileA 的所有项目加起来”?

文件名总是以“文件是”作为单元格,而“标题”行总是出现在上述空白行之后。

我不确定如何计算出一个空行,然后告诉它将行 [1] 的空白存储为文件名...然后跳过行并总计行 [1] 中的所有内容,但停在空白处。

谢谢

【问题讨论】:

    标签: python csv


    【解决方案1】:

    为了获取文件的编号,您可以利用 itertools.takewhile 从 CSV 返回行,直到找到空行。然后将数字相加并从 CSV 读取下一个文件:

    import csv
    from itertools import takewhile
    
    res = []
    with open('file.csv') as in_f:
        reader = csv.reader(in_f, delimiter=',', quotechar='"')
    
        # Read next name from CSV
        for _, name in reader:
            # Read rows and return numbers until blank line is found
            total = sum(int(row[1]) for row in takewhile(bool, reader))
            res.append((name, total))
    
    print res
    

    输出:

    [('NameofFileA', 76), ('NameofFileB', 8)]
    

    在上面bool 用作谓词让takewhile 知道是否应该返回行。由于 CSV 阅读器将返回空行为 [] 并且空的 list 是布尔上下文中的 False takewhile 将停在那里。

    然后对于takewhile 生成器表达式返回的每一行,从第二列获取值并将其转换为int。最后将这些数字相加得到总数。

    【讨论】:

    • 这很棒。你能解释一下这是如何工作的吗for _, name in reader: _,做什么?
    • @chowpay _ 只是一个变量名,就像 random_data 一样。在 Python 中,通常将一次性变量命名为 _ 以表示不会使用该变量。
    • 我理解正确,_,意思是忽略 "File is" ,使用 "NameofFileA" 。
    • @chowpay 基本上是的,reader 返回的行是一个列表['File is', 'NameofFileA'],通过将其分配给两个变量来解包:_, name = row。赋值后_ 的值为File isname 的值为NameofFileA_ 没有什么特别之处,它的行为与任何其他变量一样,但它的命名只是为了向读者表明它不用于任何事情。它的唯一目的是允许在与for 循环相同的行上提取name,因为我们需要两个变量来解压缩reader 返回的行中的两个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2020-06-25
    • 2019-11-11
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多