在关键字

时间:2017-08-30 02:25:52

标签: python

我试图编写一个程序,从两个关键词之间的文本文件中提取数据,并将数据放入元组列表中,日期为字符串,数据为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

2 个答案:

答案 0 :(得分:0)

你可以使用readlines,但最终你必须模拟for循环行为来遍历你不想要的每一行和东西。

然而,你的问题还存在于其他地方:你不能简单地从分裂字符中删除字符列表,并希望它能为你提供良好的格式。

如果你得到像[['2001-01-01,12776', '2001-01-02,15128']]这样的东西,并且因为你似乎没有寻求完美,你可以简单地拿走你已经拥有的东西,并且:

  1. 遍历数组[0]中的每个字符串。
  2. 将这些字符串拆分为两组数据。
  3. 将第二个数据转换为数字。
  4. 使用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的第二个参数将其缩减为一行。