2014-09-29 69 views
0

我有以下文件的格式读取数据蟒蛇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

这里不需要csv – njzk2 2014-09-29 17:25:51

+1

不确定你期望'linecache'在这里为你做什么;它是一个Python源代码内省工具,而不是一个通用的包。 – 2014-09-29 17:29:48

+0

@ njzk2嗯,他们只是使用linecache和行分裂是好的? – exsonic01 2014-09-29 17:32:40

回答

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源文件;无论何时需要打印回溯,本模块都会缓存涉及当前堆栈的源文件。您只能将它用于需要重复使用随机线的较小文件。

+0

感谢您提供有关linecache的建议。在我的文件中,我的数据集编号是数组,但是第3列的行数和最大数量是单个数字。我该如何储存?就像'nlines = 4010' – exsonic01 2014-09-29 17:56:17

+0

@ user1798797:你的意思是你需要读取所有'Data set'行? – 2014-09-29 17:56:59

+0

@ user1798797:代码现在将读取* all *'Data set'数字,将它们收集到一个列表中。 – 2014-09-29 17:59:00