在图像中有一个带有日期时间字符串的时间列,我有一个程序接受此列,只读取时间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张图片:
此时我不喜欢'我真的知道如何使新的输出文件看起来像第一个图像的文件,格式为H:M:S仅在第一列中,而不是像第二个图像中那样加扰。有什么建议?
参见K列,它应该是第一张图像的A列,而B,C,D,E,F,G,I和J列应该保持不变,如图1所示。
下载.csv文件的LInk:http://www.speedyshare.com/z2jwq/HiSAM1-data-160215-164858.csv
答案 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
的修改后的行。
答案 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模块中查找轻量级数据库。