蟒蛇CSV模块从头部
我有以下文件的格式读取数据蟒蛇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条标题行。谢谢
你真的没有一个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源文件;无论何时需要打印回溯,本模块都会缓存涉及当前堆栈的源文件。您只能将它用于需要重复使用随机线的较小文件。
感谢您提供有关linecache的建议。在我的文件中,我的数据集编号是数组,但是第3列的行数和最大数量是单个数字。我该如何储存?就像'nlines = 4010' – exsonic01 2014-09-29 17:56:17
@ user1798797:你的意思是你需要读取所有'Data set'行? – 2014-09-29 17:56:59
@ user1798797:代码现在将读取* all *'Data set'数字,将它们收集到一个列表中。 – 2014-09-29 17:59:00
这里不需要csv – njzk2 2014-09-29 17:25:51
不确定你期望'linecache'在这里为你做什么;它是一个Python源代码内省工具,而不是一个通用的包。 – 2014-09-29 17:29:48
@ njzk2嗯,他们只是使用linecache和行分裂是好的? – exsonic01 2014-09-29 17:32:40