Python3读取逗号分隔的CSV文件,操作变量并将其写入CSV

2024-06-26 01:31:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python的新用户,希望在CSV文件中阅读以下列出的内容:

DN, whenCreated, name, pwdLastSet, location
"CN=Jackson2,OU=Domain Controllers,DC=one,DC=onecity,DC=net",20100623145323.0Z,Jackson8,1.30745E+17,Japan,
"CN=Jackson4,OU=Prod,OU=Windows 2014 Servers,OU=STE,DC=one,DC=onecity,DC=net",20041208192730.0Z,Jackson7,1.30735E+17,Aussie,

这个CSV文件将有数千行长,我想将所有字段输出到一个新的CSV文件,并将whenCreatedpwdLastSet字段更改为人类可读的格式。如有任何建议,将不胜感激。请注意,在这个例子中有5列3行,第一行是列标题。在

所以请别着急,因为这是我写的第一个python脚本。但任何建议、意见、最佳实践都将不胜感激。在

^{pr2}$

Tags: 文件csv用户name内容netoudc
1条回答
网友
1楼 · 发布于 2024-06-26 01:31:36

正如对您的问题的第一条评论中所提到的,csv模块将负责CSV文件的基本读写。使用第一个example

import csv
with open('some.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

CSV文件向我们展示了一个csv.reader将把文件中的每一行转换成一个字符串列表

^{pr2}$

类似地,csv.writer将获取一个值列表并将其写入输出文件中的一行。在

别紧张。在

所以,你的问题中最有趣的部分是:

I)修复第一行(列标题)

请注意,第一个列表中的大多数列名都有前导空格。我们想除掉这些,因为它们可能会有问题。如果你使用过其他语言,你可能会考虑使用循环,例如

for i in range(len(row)):
    row[i] = row[i].strip()

但是,在Python中,首选的形式是使用“List comprehension”

row = [x.strip() for x in row]

II)将whenCreated转换为“人类可读格式”。

它已经是,真的,但是一些破折号和冒号会将它转换成ISO8601日期格式,所以让我们使用像这样的string对象的.format方法

x = row[1]
row[1] = '{}-{}-{}T{}:{}:{}'.format(x[:4],x[4:6],x[6:8],x[8:10],x[10:12],x[12:])

要将row[1]从这个转换。。。在

20100623145323.0Z

。。。为此:

2010-06-23T14:53:23.0Z

III)将pwdLastSet转换为“人类可读格式”。

我从你更新的问题中看到这些数字是18位的activedirectory时间戳(用科学的表示法),所以我们可以使用datetime来转换它们

from datetime import datetime
row[3] = datetime.utcfromtimestamp(float(row[3])/10000000-11644473600).isoformat() + 'Z'

将从中转换row[3]。。。在

1.30745E+17

。。。为此:

2015-04-26T05:33:20Z

相关问题 更多 >