python csv模块从头部读取数据

时间:2014-09-29 17:17:54

标签: python csv

我有以下格式的文件

# Data set number 1 
#
# Number of lines 4010
# Max number of column 3 is 5
# Blahblah
# More blahblah
1 2 1 110 
2 2 5 20 21 465 417 38
2 1 2 33 46 17
......
4010 3 5 1001 2010 3355 107 2039
# Data set number 2 
#
# Number of lines 4010
# Max number of column 3 is 5
# Blahblah
# More blahblah
1 2 1 110 
2 2 5 20 21 465 417 38
2 1 2 33 46 17
......

我希望读取数据集的数量,行数和第3列的最大数量。我搜索并找出csv模块可以读取标题,但是我可以读取这些数量的标题,并存储?我做的是

nnn = linecache.getline(filename, 1)
nnnn = nnn(line.split()[4])
number = linecache.getline(filename, 3)
number2 = number(line.split()[4])
mmm = linecache.getline(filename, 5)
mmmm = mmm(line.split()[7])
mmmmm = int(mmmm)
max_nb = range(mmmmm)
n_data = int(nnnn)
n_frame = range(n_data)
singleframe = natoms + 6

喜欢这个。如何使用csv模块读取这些数字和存储?我使用'singleframe'跳过6个标题,但也很好奇csv模块如何读取6个标题行。谢谢

1 个答案:

答案 0 :(得分:0)

你真的没有CSV文件;你有专有的格式。只需直接解析它,使用正则表达式快速提取所需的数据:

import re

set_number = re.compile(r'Data set number (\d+)'),
patterns = {
    'line_count': re.compile(r'Number of lines (\d+)'),
    'max_num': re.compile(r'Max number of column 3 is (\d+)'),
}

with open(filename, 'r') as infh:
    results = {}
    set_numbers = []

    for line in infh:
        if not line.startswith('#'):
            # skip lines without a comment
            continue

        set_match = set_number.match(line)
        if set_match:
            set_numbers.append(int(set_match.group(1)))
        else:
            for name, pattern in patterns.items():
                match = pattern.search(line)
                if match:
                    results[name] = int(match.group(1))

请勿使用linecache模块。它将整个文件读入内存,实际上只用于访问Python源文件;每当需要打印回溯时,此模块将缓存当前堆栈所涉及的源文件。您只能将它用于需要随机行重复的较小文件。