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

Python- Can't overwrite first column of .csv file with new time stamp

我有一个 .csv 文件(见图):

在图像中有一个带有日期时间字符串的时间列,我有一个程序使用这个列并且只读取时间 H:M:S。然而,不仅在我的程序中我试图让该列只读取时间戳 H:M:S ,而且我还试图覆盖第一个文件的时间列并将其替换为仅 H:M:S 使用以下代码在新的 .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)

    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 覆盖该字符串。然而,问题来了,输出文件没有替换时间列,而是替换了每一列,从而获得了如下所示的输出文件。见第二张图片:

此时我真的不知道如何使新的输出文件看起来像第一张图像的文件,仅在第一列中使用 H:M:S 格式,而不是像第二张图片。有什么建议么?

屏幕截图 BAH:

查看第K列,应该是第一张图的A列,B、C、D、E、F、G、I、J列应该和图1一样。

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

使用一些简化的数据:

#!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

输出:

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

if其实就Python 2、csv模块文件使用二进制方式。将 with 行替换为:

with open(File,'rb') as csvinput,open(output, 'wb') as csvoutput:

您的代码的主要问题似乎是您一直将 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 文件(使用重复问题的第一行进行测试)将是

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

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