[英]Python: Using CSV to parse(?) variables and then output that to another file
我是服务器管理员。 我无需进行大量脚本编写,但是a,它抬起了丑陋的头。
摘要:我有example.csv,看起来像下面的样子;
Stan,Marsh,Stan Marsh,1001,899,smarsh,smarsh@info.com
Eric,Cartman,Eric Cartman,1002,898,ecartman,ecartman@info.com
现在。 我正在尝试读取csv文件。 然后,我想从每一行中获取值并将其放入类似的内容中;
dn: cn=$CN,ou=People,dc=domain,dc=com
cn: $CN
gidnumber: 20
givenname $FN
homedirectory /home/users/$USER
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: $LN
uid: $USERNAME
telephoneNumber: $TELE
uidnumber: $UIDN
userpassword: {CRYPT}mrpoo
mail: $EMAIL
如您所见,我正在尝试制作一个LDIF文件,该文件允许我导入用户名,然后自动填写变量。
我似乎无法拼凑而成。
我也没有走太远。 我学会了打印行,是的...!
import csv
with open('example.csv', 'rb') as f:
reader = csv.reader(f)
for row in reader:
print row
我认为逻辑如下。
任何帮助,将不胜感激。
像这样的东西应该工作。
CSV模块对于像您这样的文件来说是多余的。
我在这里使用的一些Python惯用法:
dict(zip(keys, values))
- dict(zip(keys, values))
一个键列表和一个值列表; dict
函数(或dict.update
)可以将它们分解为键值对以添加到dict %(foo)s
)然后可以消化一个字典 那里有defaults
,因此字符串插值不会因丢失值而阻塞。 适应您的需求。 :)
。
if True: # For testing -- use the other branch to read from a file
# Declare some test content in a string...
input_content = """
Stan,Marsh,Stan Marsh,1001,899,smarsh,smarsh@info.com
Eric,Cartman,Eric Cartman,1002,898,ecartman,ecartman@info.com
""".strip()
# And use the StringIO module to create a file-like object from it.
from StringIO import StringIO
input_file = StringIO(input_content)
else:
# Or just open the file as normal. In a short script like this,
# one doesn't need to worry about closing the file - that will happen
# when the script ends.
input_file = open('example.csv', 'rb')
# Declare the fields in the order they are in the file.
# zip() will use this later with the actual fields from the file
# to create a dict mapping.
fields = ('FN', 'LN', 'NAME', 'UIDN', 'GIDN', 'CN', 'EMAIL') # Fields, in order
# Declare a template for the LDIF file. The %(...)s bits will be
# later interpolated with the dict mapping created for each input row.
template = u"""
dn: cn=%(CN)s,ou=People,dc=domain,dc=com
cn: %(CN)s
gidnumber: 20
givenname %(FN)s
homedirectory /home/users/%(USER)s
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: %(LN)s
uid: %(USERNAME)s
telephoneNumber: %(TELE)s
uidnumber: %(UIDN)s
userpassword: {CRYPT}mrpoo
mail: %(EMAIL)s
"""
for line in input_file:
# Create `vals` with some default values. These would be overwritten
# if the CSV data (and of course the declared fields) contain them.
vals = {"USER": "XXX", "TELE": "XXX", "USERNAME": "XXX"}
# line.strip().split() will turn the string line,
# for example 'foo,baz,bar\n' (trailing new line `strip`ped out)
# into the list ['foo', 'baz', 'bar'].
# zipping it with, say, ['LN', 'FN', 'EMAIL'] would yield
# [('LN', 'foo'), ('FN', 'baz'), ('EMAIL', 'bar')] --
# ie. a list of tuples with a key and a value.
# This can be used by the `dict.update` function to replace and augment
# the default values declared above.
vals.update(zip(fields, line.strip().split(",")))
# Finally, use the interpolation operator % to merge the template with the
# values for this line and print it to standard output.
print template % vals
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.