【问题标题】:Is there a way to start a DictReader at a specified line?有没有办法在指定的行启动 DictReader?
【发布时间】:2021-05-18 18:23:54
【问题描述】:

我想打开一个读取器对象并进行集成,直到匹配“事务日期”,在这种情况下使用 DictReader 来获取一个 dict 对象。

starting=0
with open(argv[1], 'r')as file:
    transaction = list(csv.reader(file))
    #what line is the dictReader on?
    counter=0
    for line in transaction:
        counter+=1
        if line[0]=='Transaction Date':
            starting=counter-1
    
    a=csv.DictReader(file)
    
    for b in a:
        print(b)

编辑:解决方案

    file=open(argv[1],'r')
    #go to that line
    for i in range(starting):
        file.readline()
        
    #read in as dict
    dict=list(csv.DictReader(file))

【问题讨论】:

  • 这行得通吗?您的 minimal reproducible example 应包含 csv 数据的最小示例。为什么不从 DictReader 开始迭代它,直到满足您的条件然后开始处理

标签: python csv syntax filereader


【解决方案1】:

你可以使用itertools.dropwhile,类似

from itertools import dropwhile


def f(line):
    return line[0] != 'Transaction Date'


with open(argv[1], 'r') as file:
    transaction = dropwhile(f, csv.reader(file))
    for b in transaction:
        print(b)

【讨论】:

    【解决方案2】:

    从一个 DictReader 开始;在 while 循环中检查每个 row 直到满足您的条件;然后使用 for 循环进行迭代以处理其余部分。

    import io, csv
    
    data = '''col_a,col_b
    transaction week,4
    transaction second,5
    transaction date,6
    foo,7
    bar,8
    the end,9
    '''
    with io.StringIO(data) as f:
        reader = csv.DictReader(f)
        row = next(reader)
        while row['col_a'] != 'transaction date':
            row = next(reader)
        for row in reader:
            print(row)
    

    【讨论】:

    • Python37-32\lib\csv.py",第 112 行,在 next 行 = next(self.reader) StopIteration
    • @YesNo - 如果您在 while 循环中获得 StopIteration during,则意味着条件从未满足并且阅读器已用完。该解决方案适用于 我的 示例数据 - 这就是为什么在您的问题中包含示例数据很重要 - 这样我们就可以在您操作的相同数据上测试解决方案。请阅读并提供minimal reproducible example
    • 感谢您的回复。生病辩护地调查它以备将来参考
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2014-08-22
    • 2020-08-11
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    相关资源
    最近更新 更多