Python-不能用新的时间戳覆盖.csv文件的第一列

时间:2016-03-23 05:01:54

标签: python csv datetime writer

我有一个.csv文件(见图): enter image description here

在图像中有一个带有日期时间字符串的时间列,我有一个程序接受此列,只读取时间H:M:S。然而,不仅在我的程序中,我试图使列只读取时间戳H:M:S,但我也试图覆盖第一个文件的时间列,只用H:M替换它:使用以下代码将时间戳记到新的.csv上。

CODE:

import csv
import datetime as dt
import os

File = 'C:/Users/Alan Cedeno/Desktop/Test_Folder/HiSAM1_data_160215_164858.csv'
root, ext = os.path.splitext(File)
output = root + '-new.csv'
with open(File,'r') as csvinput,open(output, 'w') as csvoutput:

    writer = csv.writer(csvoutput, lineterminator='\n')
    reader = csv.reader(csvinput)

    all = []
    row = next(reader)
    for line in reader:
        row.append(dt.datetime.strptime(line[0],'%m/%d/%Y %H:%M:%S').time())
        all.append(row)

    for row in reader:
        row.append(row[0])
        all.append(row)

    writer.writerows(all)

该程序工作,并获取日期时间字符串并用新的.csv文件中的时间戳H:M:S覆盖该字符串。但是,这是问题,输出文件而不是替换它替换每列的时间列,获得看起来像这样的输出文件。见第2张图片:

enter image description here

此时我不喜欢'我真的知道如何使新的输出文件看起来像第一个图像的文件,格式为H:M:S仅在第一列中,而不是像第二个图像中那样加扰。有什么建议?

SCREENSHOT enter image description here对于BAH:

参见K列,它应该是第一张图像的A列,而B,C,D,E,F,G,I和J列应该保持不变,如图1所示。

下载.csv文件的LInk:http://www.speedyshare.com/z2jwq/HiSAM1-data-160215-164858.csv

3 个答案:

答案 0 :(得分:3)

你的代码的主要问题似乎是你在第一行追加到csv中每一行的时间,这导致在问题中发布了第二张图片。

我们的想法是跟踪不同的行并仅修改每行的第一个元素。此外,如果需要,您应该保留第一行,表示列的标签。为了解决这个问题,代码看起来像:

import csv
import datetime as dt
import os

File = 'C:/Users/Alan Cedeno/Desktop/Test_Folder/HiSAM1_data_160215_164858.csv'
root, ext = os.path.splitext(File)
output = root + '-new.csv'
with open(File,'r') as csvinput,open(output, 'w') as csvoutput:

    writer = csv.writer(csvoutput, lineterminator='\n')
    reader = csv.reader(csvinput)

    rows = [next(reader)]
    for line in reader:
        line[0] = str(dt.datetime.strptime(line[0],'%m/%d/%Y %H:%M:%S').time())
        rows.append(line)

    writer.writerows(rows)

请注意,列表rows包含来自csvinput的修改后的行。

生成的输出csv文件(在问题中第一行测试重复)将是 enter image description here

答案 1 :(得分:0)

使用一些简化的数据:

{
    _id: ObjectID(x),  // this document's _id
    name: "Josh",
    last_name: "Richard",
    address: "2 Happy Lane",
    city: "New York",
    state: "New York",
    credit_card: 999999999999999,
    cvv: 999,
    exp: 3/18,
    transactions: [
        {
            _id: ObjectID(x),  // this is what i'm asking about
            child_ids: [
                ObjectID(x),   // this is the _id of a doc in another collection
                ObjectID(x)    // this is also the _id of a doc in another collection
            ]
        },
        {
            _id: ObjectID(x),
            child_ids: [
                ObjectID(x),   // this is the _id of a doc in another collection
            ]
        }
    ]
}

输入:

#!python3
import csv
import datetime as dt
import os

File = 'data.csv'
root, ext = os.path.splitext(File)
output = root + '-new.csv'

# csv module documents opening with `newline=''` mode in Python 3.
with open(File,'r',newline='') as csvinput,open(output, 'w',newline='') as csvoutput:
    writer = csv.writer(csvoutput)
    reader = csv.reader(csvinput)

    # Copy the header
    row = next(reader)
    writer.writerow(row)

    # Edit the first column of each row.
    for row in reader:
        row[0] = dt.datetime.strptime(row[0],'%m/%d/%Y %H:%M:%S').time()
        writer.writerow(row)

输出:

Time,0.3(/L),0.5(/L)
02/15/2016 13:44:01,88452,16563
02/15/2016 13:44:02,88296,16282

如果实际上在Python 2上,Time,0.3(/L),0.5(/L) 13:44:01,88452,16563 13:44:02,88296,16282 模块文档使用二进制模式。将csv行替换为:

with

答案 2 :(得分:0)

您不能覆盖CSV文件中的一行。您必须将想要的所有行都写入一个新文件,然后将其重命名为原始文件名。

您的使用方式可能比CSV文件更适合数据库。在sqlite3模块中查找轻量级数据库。