簡體   English   中英

使用Python csv模塊覆蓋csv文件中的特定列

[英]Overwrite a specific column in a csv file using Python csv module

我使用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[0] = y # or row = [y] + row[1:], or ...

如果要將其寫回文件,則需要使用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文件,並清理所有重復和未使用的代碼。 在我們處理它時,我會將日期轉換代碼分解為函數。 並使用易於使用的功能,而不是使其變得困難和脆弱的功能。

所以:

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))

首先,有更好的方法將文本日期時間格式轉換為UNIX時間戳。 直接使用time模塊可將您的代碼簡化為:

import time
import calendar

timestamp = calendar.gmtime(time.strptime(row[0], '%Y-%m-%d %H:%M:%S'))

但即使是你創建的datetime對象也有.timetuple().utctimetuple()方法,這些方法在生成time_struct元組時比將datetime對象的字符串格式解析回整數元組更加可靠。 您不妨這樣做直接 row[0]作為輸出str(datetime.now()) 相同的格式,你開始用什么。

接下來,寫完一個新文件,並在完成后用它替換舊文件:

import csv
import time
import calendar
import os

with open('FakeAPData.csv', 'rb') as infile, open('FakeAPData.csv.new', 'wb') as outfile:
    writer = csv.writer(outfile)
    for row in csv.reader(infile):
        timestamp = calendar.gmtime(time.strptime(row[0], '%Y-%m-%d %H:%M:%S'))
        writer.writerow([timestamp] + row[1:])

os.rename('FakeAPData.csv.new', 'FakeAPData.csv')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM