带有多个表的Python3.7 CSV文件,如何仅获取中间表

时间:2019-07-18 13:03:15

标签: python python-3.x csv

我有一个包含多个标头和表的CSV文件,该文件是由我们的系统创建的。行数是动态的,但表标题名称始终相同。在每个表之间,有一个空白行。 我正在使用python3.7.3,想要获取中间表(设备表),然后上传到我们的数据库中。

如何才能只获得中间表?在这种情况下,正则表达式可以使用CSV文件吗?

原始文件:

Report title:ABC
Created Date:Jul-15-2019

Model
Model Name,Number
abc,1
abc,2

Device
Device Name,Number
efg,1
efg,2
efg,3

Missing Device
Device Name,Number
xyz,3
xyz,4

我想要的表(没有表名):

Device Name,Number
efg,1
efg,2
efg,3

2 个答案:

答案 0 :(得分:0)

如果您知道所有表都由换行符隔开,则可以只计算换行符,然后解析目标表。像这样:

import csv

table_ix = 2
with open('test.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    empty_line_count = 0
    for row in csv_reader:
        if len(row) == 0:
            empty_line_count += 1
        if empty_line_count == table_ix:
            # do your parsing here
            print(row)

它不漂亮,但是可以用。但我建议您使用Pandas等工具。

答案 1 :(得分:0)

这是一种方法:

  1. 打开文件进行输入
  2. 跳过所有行,直到找到包含标题的行
  3. 从此处开始所有不为空的行
  4. 将这些行输入CSV阅读器

代码

import csv
import itertools

with open('report.txt') as fh:
    fh = itertools.dropwhile(lambda line: 'Device Name,Number' not in line, fh)
    fh = itertools.takewhile(lambda line: line != '\n', fh)
    reader = csv.reader(fh)
    for row in reader:
        print(row)

输出

['Device Name', 'Number']
['efg', '1']
['efg', '2']
['efg', '3']

注释

  • 我使用itertools.dropwhile来执行第2步
  • ...和itertools.takewhile进入第3步