我有一個CSV文件有幾個條目,每個條目有2個unix時間戳格式化日期。Python中的正則表達式替換
我有一個名爲convert()
的方法,它接收時間戳並將其轉換爲YYYYMMDD
。
現在,由於每行有兩個時間戳,我將如何用新值替換每個時間戳?
編輯:只是爲了澄清,我想將每個出現的時間戳轉換爲YYYYMMDD
格式。這是什麼在擾亂我,因爲re.findall()
返回一個列表。
我有一個CSV文件有幾個條目,每個條目有2個unix時間戳格式化日期。Python中的正則表達式替換
我有一個名爲convert()
的方法,它接收時間戳並將其轉換爲YYYYMMDD
。
現在,由於每行有兩個時間戳,我將如何用新值替換每個時間戳?
編輯:只是爲了澄清,我想將每個出現的時間戳轉換爲YYYYMMDD
格式。這是什麼在擾亂我,因爲re.findall()
返回一個列表。
修改我認爲通過「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傳遞給它。
如果你知道更換:
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有點粗略,希望我說得對。 – 2009-05-26 03:02:29
他說Unix時間戳,應該是類似1243326265(當前時間)。他希望將YYYYMMDD格式作爲輸出。 – tzot 2009-05-26 08:26:19
我會沿着這些線使用一些東西。很像勞倫斯的迴應,但是您需要轉換時間戳,並將文件名作爲參數。此代碼假定您正在使用最近的日期(在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)
我無法評論你的問題,但是你看看蟒蛇的CSV模塊? http://docs.python.org/library/csv.html#module-csv
謝謝!我還在開始python,這有很大幫助。 – aaront 2009-05-26 03:25:01
我得到一個「沒有這樣的組」的錯誤。 – aaront 2009-05-26 03:34:33
嗯......你輸入這個錯誤的輸入行是什麼樣的? (您可能希望在調試時在sys.stdout.write行之後添加一個'sys.stdout.flush()'調用。) – 2009-05-26 03:56:19