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 模块。
我有一个 .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 格式,而不是像第二张图片。有什么建议么?
屏幕截图
查看第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 模块。