我正在使用Python csv模块读取csv文件,每一行都像这样:
2013-04-16 7:11:01,186744,3,2,2,1.89E-03
然后,我将row [0]转换为Unix时间,但是我想用刚为csv文件的每一行找到的Unix时间替换datetime
import pymongo import datetime import re import csv import calendar X = [] OBD = [] Y = [] csv_in = open('FakeAPData.csv', 'rb') for row in reader: date = datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S') datet = unicode(datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S')) datett = tuple(int(v) for v in re.findall("[0-9]+", datet)) y = calendar.timegm(datett) Y.append(y)
因此,我使用unixtime值创建了列表Y,但是接下来我该如何进行替换,以产生如下所示的输出:
1366097085,186744,3,2,2,1.89E-03
每个row只是一个list。您可以就地对其进行修改,也可以使用要替换的值创建一个新列表:
row
list
row[0] = y # or row = [y] + row[1:], or ...
如果要将其写回文件,则需要使用csv.writer。例如:
csv.writer
os.rename('FakeAPData.csv', 'FakeAPData.csv.bak') csv_in = open('FakeAPData.csv.bak', 'rb') csv_out = open('FakeAPData.csv', 'wb') writer = csv.writer(csv_out) for row in csv.reader(csv_in): date = datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S') datet = unicode(datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S')) datett = tuple(int(v) for v in re.findall("[0-9]+", datet)) y = calendar.timegm(datett) row[0] = y writer.writerow(row)
当然,您还需要保存close文件,并清理所有重复和未使用的代码。在此过程中,我会将日期转换代码分解为一个函数。并使用使操作变得容易的功能,而不是使操作变得困难和脆弱的功能。
close
所以:
def transform_date(date): return calendar.gmtime(datetime.strptime(date, '%Y-%m-%d %H:%M:%S').timetuple()) def transform_row(row): return [transform_date(row[0])] + row[1:] name = 'FakeAPData.csv' bakname = name + '.bak' os.rename(name, bakname) with open(bakname, 'rb') as in csv_in, open(name, 'wb') as csv_out: writer = csv.writer(csv_out) writer.writerows(transform_row(row) for row in csv.reader(csv_in))