【问题标题】:Replace column in csv with modified column用修改后的列替换 csv 中的列
【发布时间】:2015-09-12 16:30:32
【问题描述】:

我得到了一个 csv 文件,其中包含几列和一个包含 4 行的标题。第一列包含时间戳。不幸的是,它也给出了毫秒,但只要它们为 00,文件中就不会给出它们。看起来是这样的:

"TOA5","CR1000","CR1000","E9048"
"TIMESTAMP","RECORD","BattV_Avg","PTemp_C_Avg"
"TS","RN","Volts","Deg C"
"","","Avg","Avg"
"2015-08-28 12:40:23.51",1,12.91,32.13
"2015-08-28 12:50:43.23",2,12.9,32.34
"2015-08-28 13:12:22",3,12.91,32.54

因为我不需要毫秒,所以我想去掉那些,因为这会使包含时间的进一步计算变得有点复杂。到目前为止我的方法:

提取每行的前 20 位数字,得到 2015-08-28 12:40:23 等格式

timestamp = []
with open(filepath) as f:
    for _ in xrange(4): #skip 4 header rows
        next(f)
    for line in f:
        time = line[1:20] #Get values for the current line
        timestamp.append(time) #Add values to list

从这里开始,我一直在为如何继续前进而苦苦挣扎。我想将 csv 文件中的第一列与新创建的 timestamp 列表交换。

我尝试创建字典,但我不知道如何使用第 2 行中的标题标题作为键:

d = {}
with open(filepath, 'rb') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    for col in csv_reader:
        #use header info from row 2 as key here

这会将整个 csv 文件导入到字典中,然后我将使用上面的 timestamp 列表更改字典中的 TIMESTAMP 条目。这甚至可能吗?

或者有没有一种更简单的方法来使用我的新列表更改 csv 中的第一列,以便我的 csv 文件最终包含时间戳,而没有毫秒信息?

所以我的 csv 中的第一列应该如下所示:

"TOA5"
"TIMESTAMP"
"TS"
""
2015-08-28 12:40:23
2015-08-28 12:50:43
2015-08-28 13:12:22

【问题讨论】:

  • 你能展示一下文件的样子吗?尤其是您要获取的第 2 行的标题信息。
  • 还建议添加您希望 csv 在您的操作后的样子。
  • 我编辑了包含此信息的初始帖子
  • 1 / 2 是否也存在于文件中?文件本身中的标题是否都像这样引用?我建议您直接将 csv 的开头几行复制粘贴到此处。
  • 更新了最初的帖子。文件中没有枚举,抱歉。但是,是的,报价就在那里。这就是它现在的实际样子(不过还有 30 列)。

标签: python list python-2.7 python-3.x


【解决方案1】:

应该这样做并保留引用:

with open(filepath1, 'rb') as fin, open(filepath2, 'wb') as fout:
    reader = csv.reader(fin)
    writer = csv.writer(fout, quoting=csv.QUOTE_NONNUMERIC)
    for _ in xrange(4):  # copy first 4 header rows
        writer.writerow(next(reader))
    for row in reader:  # process data lines
        row[0] = row[0][:19] # strip fractional seconds from first column
        writer.writerow([row[0], int(row[1])] + map(float, row[2:]))

由于csv.reader 将每行的列作为字符串列表返回,因此有必要将任何包含数值的列转换为其实际的intfloat 数值,然后再将它们写出以防止它们被写出被引用。

【讨论】:

    【解决方案2】:

    我相信您可以通过迭代原始 csv 并根据需要替换时间戳来轻松创建新 csv。

    例子-

    with open(filepath, 'rb') as csv_file, open('<new file>','wb') as outfile:
        csv_reader = csv.reader(csv_file, delimiter=',')
        csv_writer = csv.writer(outfile, delimiter=',')
        for i, row in enumerate(csv_reader):    #Enumerating as we only need to change rows after 3rd index.
            if i <= 3:
                csv_writer.writerow(row)
            else:
                csv_writer.writerow([row[0][1:20]] + row[1:])
    

    【讨论】:

    • 哇,太棒了。我从来没想过!还有一个问题:在我新创建的文件中,所有引号都被删除了。知道为什么吗?当用访问此文件的机器输出替换此文件时,这可能是一个问题。
    • 是否要引用所有字段?如果是这样打开csv.writer 时,您可以添加一个额外的参数quoting=csv.QUOTE_ALL
    【解决方案3】:

    我不完全确定如何解析您的 csv,但我会做一些类似的事情:

    time = time.split(".")[0]
    

    所以如果它确实有一毫秒,它就会被删除,如果它没有,什么都不会发生。

    【讨论】:

      猜你喜欢
      • 2016-09-12
      • 2015-11-05
      • 2012-08-11
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2011-02-21
      • 2013-06-26
      • 1970-01-01
      相关资源
      最近更新 更多