我试图编写一个程序,从两个关键词之间的文本文件中提取数据,并将数据放入元组列表中,日期为字符串,数据为int。我只能在循环
时使用for循环开始步骤数据
2010-01-01,1000
2010-01-02,2000
结束步骤数据
需要提取到这种格式[('2001-01-01',12776),('2001-01-02',15128)]
我写了这个程序:
mylist = []
line = open(filename).read()
start = '<begin step data>'
end = '<end step data>'
startpos = line.find(start) + len(start)
endpos = line.find(end, startpos)
data = line[startpos:endpos].strip("")
mylist.append(data.split())
但是它的格式错误:[['2001-01-01,12776','2001-01-02,15128']]
我想我可能对此有错误,应该使用readlines而不是read
答案 0 :(得分:0)
你可以使用readlines,但最终你必须模拟for循环行为来遍历你不想要的每一行和东西。
然而,你的问题还存在于其他地方:你不能简单地从分裂字符中删除字符列表,并希望它能为你提供良好的格式。
如果你得到像[['2001-01-01,12776', '2001-01-02,15128']]
这样的东西,并且因为你似乎没有寻求完美,你可以简单地拿走你已经拥有的东西,并且:
使用for循环,然后可以转换..
desired_format = [] # Initialize empty result array.
for element in curr_result[0]:
element = element.split(',') # Separate values separated by comas.
# Finally add seeken results as tuples.
desired_format.append(
(
element[0],
int(element[1]) # Cast second element as integer.
)
)
(中间括号正在表示元组。)
请注意,如上所述,对于当前问题,这是一个快速而肮脏的修复方法,但是有更好的方法可以做到这一点,您可能会在以后挖掘出来。
但是你不会在奖励课程中停在这里。 ^^“
答案 1 :(得分:0)
尝试使用带有f1
模块的正则表达式(对正则表达式here的更深入解释):
re
如果您愿意,可以使用# Find the (date, data) pairs
matches = re.findall('(\d{4}-\d{2}-\d{2}),(\d+)', text)
# Convert the data to an integer
matches = map(lambda m: (m[0], int(m[1])), matches)
调用作为re.findall
的第二个参数将其缩减为一行。