2009-05-26 114 views
2

我有一个CSV文件有几个条目,每个条目有2个unix时间戳格式化日期。Python中的正则表达式替换

我有一个名为convert()的方法,它接收时间戳并将其转换为YYYYMMDD

现在,由于每行有两个时间戳,我将如何用新值替换每个时间戳?

编辑:只是为了澄清,我想将每个出现的时间戳转换为YYYYMMDD格式。这是什么在扰乱我,因为re.findall()返回一个列表。

回答

1

修改我认为通过“unix时间戳格式化日期”是指从时代开始数秒。这假定文件中的每个数字都是UNIX时间戳。如果不是这种情况就需要调整正则表达式:

import re, sys 

# your convert function goes here 

regex = re.compile(r'(\d+)') 
for line in sys.stdin: 
    sys.stdout.write(regex.sub(lambda m: 
    convert(int(m.group(1))), line)) 

这从标准输入读取和电话转换上找到每个号码。

这里的“诀窍”是re.sub可以接受一个从匹配对象转换为字符串的函数。我假设你的convert函数需要一个int并返回一个字符串,所以我用lambda作为一个适配器函数来抓取匹配的第一组,并将其转换为int,然后将结果int传递给它。

+0

谢谢!我还在开始python,这有很大帮助。 – aaront 2009-05-26 03:25:01

+0

我得到一个“没有这样的组”的错误。 – aaront 2009-05-26 03:34:33

+0

嗯......你输入这个错误的输入行是什么样的? (您可能希望在调试时在sys.stdout.write行之后添加一个'sys.stdout.flush()'调用。) – 2009-05-26 03:56:19

3

如果你知道更换:

p = re.compile(r',\d{8},') 
p.sub(','+someval+',', csvstring) 

如果它是一个格式变化:

p = re.compile(r',(\d{4})(\d\d)(\d\d),') 
p.sub(r',\3-\2-\1,', csvstring) 

编辑:对不起,只是意识到你说的蟒蛇,上述

+0

我的python有点粗略,希望我说得对。 – 2009-05-26 03:02:29

+1

他说Unix时间戳,应该是类似1243326265(当前时间)。他希望将YYYYMMDD格式作为输出。 – tzot 2009-05-26 08:26:19

0

我会沿着这些线使用一些东西。很像劳伦斯的回应,但是您需要转换时间戳,并将文件名作为参数。此代码假定您正在使用最近的日期(在9/9/2001之后)。如果您需要更早的日期,请降低10到9或更低。

import re, sys, time 

regex = re.compile(r'(\d{10,})') 

def convert(unixtime): 
    return time.strftime("%Y%m%d", time.gmtime(unixtime)) 

for line in open(sys.argv[1]): 
    sys.stdout.write(regex.sub(lambda m: convert(int(m.group(0))), line)) 

编辑:清理了代码。

采样输入

foo,1234567890,bar,1243310263 
cat,1243310263,pants,1234567890 
baz,987654321,raz,1 

输出

foo,20090213,bar,20090526 
cat,20090526,pants,20090213 
baz,987654321,raz,1 # not converted (too short to be a recent)