我有一个包含多个条目的 CSV 文件,每个条目都有 2 个 unix 时间戳格式的日期。
我有一个名为 的方法convert()
,它接收时间戳并将其转换为YYYYMMDD
.
现在,由于我在每一行中有 2 个时间戳,我将如何用新值替换每个时间戳?
编辑:为了澄清,我想将每个出现的时间戳转换为YYYYMMDD
格式。这就是困扰我的地方,因为它re.findall()
返回了一个列表。
如果你知道替换:
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,上面修改过
我假设“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
可以采用一个将匹配对象转换为字符串的函数。我假设您的转换函数需要一个 int 并返回一个字符串,所以我使用 lambda 作为适配器函数来获取匹配的第一组,将其转换为 int,然后将生成的 int 传递给转换。
无法评论您的问题,但您是否看过 python 的 CSV 模块? http://docs.python.org/library/csv.html#module-csv
我会使用这些方面的东西。很像 Laurence 的响应,但具有您请求的时间戳转换并将文件名作为参数。此代码假定您正在使用最近的日期(2001 年 9 月 9 日之后)。如果您需要更早的日期,请降低 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)