我有一个包含多个条目的CSV文件,每个条目都有2个unix时间戳格式的日期。
我有一个名为convert()
的方法,它接受时间戳并将其转换为YYYYMMDD
。
现在,由于每行有2个时间戳,如何用新值替换每个时间戳?
编辑:为了澄清,我想将每次出现的时间戳转换为YYYYMMDD
格式。这就是困扰我的事情,因为re.findall()
会返回一个列表。
答案 0 :(得分: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 )
编辑:对不起,刚刚意识到你说过python,修改过上面
答案 1 :(得分:1)
我假设“unix timestamp formatted date”是指自纪元以来的秒数。这假定文件中的每个数字都是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))
这是从stdin读取并在每个找到的号码上调用convert。
这里的“技巧”是re.sub
可以采用从匹配对象转换为字符串的函数。我假设您的转换函数需要一个int并返回一个字符串,所以我使用lambda作为适配器函数来获取匹配的第一组,将其转换为int,然后将结果int传递给转换。
答案 2 :(得分:1)
无法评论您的问题,但您是否看过python的CSV模块? http://docs.python.org/library/csv.html#module-csv
答案 3 :(得分:0)
我会沿着这些方向使用某些东西。很像Laurence的响应,但是你请求了时间戳转换,并将文件名作为参数。此代码假定您正在使用最近的日期(在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)