im试图编写一个程序,该程序在两个关键单词之间从文本文件中提取数据,并将数据放入元组列表中,将日期作为字符串和数据作为字符串,将数据作为一个int。我不能仅在循环
时用于循环开始步骤数据
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-01,12776','2001-01-01-02,15128']
我认为我可能对此有错误的侵犯
您可以使用读取线,但是您最终必须模仿循环行为以遍历每条线和东西,这是您不想要的。
但是,您的问题位于其他地方:您不能简单地从碎片中剥离字符列表,并期望它可以使您获得好格式。
如果您得到了诸如[['2001-01-01,12776', '2001-01-02,15128']]
之类的东西,并且由于您似乎并没有寻求完美,则可以简单地接受已经拥有的东西,
- 通过数组中的每个字符串迭代[0]。
- 将这些字符串分成两组数据。
- 将第二个数据投入数字。
使用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.
)
)
(中间括号正在使元组捕获。)
请注意,如前所述,这是当前问题的快速而肮脏的修复程序,但是有很多更好的方法可以做到这一点,您可以稍后再挖掘。
但是您不会在奖金课程中停止。^^'
尝试使用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
调用作为map
的第二个参数将其切成一条线。