当前位置: 首页 > 面试题库 >

使用Python csv模块覆盖csv文件中的特定列

蔡鸿骞
2023-03-14
问题内容

我正在使用Python csv模块读取csv文件,每一行都像这样:

2013-04-16 7:11:01,186744,3,2,2,1.89E-03

然后,我将row [0]转换为Unix时间,但是我想用刚为csv文件的每一行找到的Unix时间替换datetime

import pymongo
import datetime
import re
import csv
import calendar

X = []
OBD = []
Y = []

csv_in = open('FakeAPData.csv', 'rb')


for row in reader:
    date = datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S')
    datet = unicode(datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S'))
    datett = tuple(int(v) for v in re.findall("[0-9]+", datet))
    y = calendar.timegm(datett)
    Y.append(y)

因此,我使用unixtime值创建了列表Y,但是接下来我该如何进行替换,以产生如下所示的输出:

1366097085,186744,3,2,2,1.89E-03

问题答案:

每个row只是一个list。您可以就地对其进行修改,也可以使用要替换的值创建一个新列表:

row[0] = y # or row = [y] + row[1:], or ...

如果要将其写回文件,则需要使用csv.writer。例如:

os.rename('FakeAPData.csv', 'FakeAPData.csv.bak')

csv_in = open('FakeAPData.csv.bak', 'rb')
csv_out = open('FakeAPData.csv', 'wb')

writer = csv.writer(csv_out)

for row in csv.reader(csv_in):
    date = datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S')
    datet = unicode(datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S'))
    datett = tuple(int(v) for v in re.findall("[0-9]+", datet))
    y = calendar.timegm(datett)
    row[0] = y
    writer.writerow(row)

当然,您还需要保存close文件,并清理所有重复和未使用的代码。在此过程中,我会将日期转换代码分解为一个函数。并使用使操作变得容易的功能,而不是使操作变得困难和脆弱的功能。

所以:

def transform_date(date):
    return calendar.gmtime(datetime.strptime(date, '%Y-%m-%d %H:%M:%S').timetuple())

def transform_row(row):
    return [transform_date(row[0])] + row[1:]

name = 'FakeAPData.csv'
bakname = name + '.bak'
os.rename(name, bakname)
with open(bakname, 'rb') as in csv_in, open(name, 'wb') as csv_out:
    writer = csv.writer(csv_out)
    writer.writerows(transform_row(row) for row in csv.reader(csv_in))


 类似资料:
  • 示例CSV: 我试图只捕获特定的列,例如、、和。 我看到的代码使我相信我可以通过相应的编号调用特定的列,因此:将对应于,使用迭代每一行将产生第2列中的所有项。只是它没有。

  • 问题内容: 我正在尝试解析一个csv文件,并仅从特定列中提取数据。 范例csv: 我想只捕获特定的列,说,,和。 我看过的代码使我相信我可以通过其对应的编号来调用特定的列,即:将对应于2并遍历每一行使用会产生列2中的所有项目。只有它不能。 到目前为止,这是我所做的: 并且我希望这只会打印出我想要的每一行的特定列,除非不是,我只会得到最后一列。 问题答案: 你会得到从这个代码的最后一列的唯一方法是,

  • 我仍然是python的新手,我已经尝试过这种方式覆盖txt文件上的一行 ''' 答案 =输入(“俄/秒/升/米:”) ''' 它会替换txt文件上的所有文本行,无论我想做什么,当我选择R时,它会写入txt文件的第一行,当我选择S时,它会写入txt文件的第三行 我现在已经尝试过了 ''' ''' 有人能告诉我正确的方向吗

  • 我正在Java写一个程序来更新文本文档上的数据。更新由按钮(JButton)触发。 特别是,我需要区分文档中的3行: 第一个描述了一个名为“total”的浮点值 第二个描述了一个名为“fail”的浮点值 第三个描述了一个称为“rate”的双值 在程序执行期间,我希望读取文档的3行并将其分配给变量;按下按钮后,相应的变量必须覆盖文档中的值。 为了实现这一点,我的理由如下: 我声明了3个私有变量(总数

  • 问题内容: 我有问题要覆盖使用from … import语句的方法。一些例子来说明这个问题: 我想重写print_message(msg)方法而不更改a或b模块中的代码。我尝试了很多方法,但是从… import导入了原始方法。当我将代码更改为 比我看到的改变。 你能建议我如何解决这个问题吗? 预先感谢您的任何小例子。 最好的祝福 ------------------更新--------------

  • 问题内容: 我必须在csv文件中的特定单元格(例如第8个单元格)中写入一个值。我可以看到有一种写整行的方法,但是我看不到有什么可以向特定单元格写入值的方法。 问题答案: 该 CSV模块 提供了一些工具来读取和写入的CSV文件,但 不允许修改特定的细胞原位 。 即使您在问题中突出显示的方法也不允许您标识和覆盖特定行。而是将参数写入编写器的文件对象,实际上,它只是将与编写器关联的csv文件追加了一行。