2012-07-10 128 views
0

有人可以帮我弄清楚我做错了什么吗? 我在写一个需要一个ldif文件和一个csv文件的python shell脚本,然后将csv文件中的内容附加到ldif中每条记录的末尾。喜欢的东西:Python ldif注入和csv阅读脚本

样品CSV:

 

    "KEY","VALUE" 
    "abc","def" 
    "foo","bar" 
    "qwop","flop" 

样品.ldif:

 

    dn: Aziz 
    cn: Aziz_09 

    dn: Carl 
    cn: Carl_04 

蟒蛇myscript.py “sample.ldif” “sample.csv”

 

    dn: Aziz 
    cn: Aziz_09 
    KEY: VALUE 
    abc: def 
    foo: bar 
    qwop: flop 

    dn: Carl 
    cn: Carl_04 
    KEY: VALUE 
    abc: def 
    foo: bar 
    qwop: flop 

后到目前为止,我的代码编译但是它不会正确修改文件。我正在创建一个对象,该对象在创建时需要一个csv文件路径名字符串,然后将这些键存储到一个列表字段中,并将这些值存储到一个列表字段中。然后我打开LDIF文件,分析了记录之间的转义字符,并在每个记录的末尾插入列表字段(key和value):

 

    import sys, csv 

    # Make new object that can open a csv and set csv data in its arrays 
    class Container(object): 
     def __init__(self, filename=None, keys=None, values=None): 
     self.filename = filename 
     self.keys = [] 
     self.values = [] 

     # Opens self.filename and puts 0th and 1st rows into keys and values respectively 
     def csv_to_list(): 
     with open(self.filename, 'rb') as f: 
      reader = csv.reader(f) 
      for row in reader: 
      self.keys = row[0] 
      self.values = row[1] 

    haruhi = Container("./content/test_pairs.txt") 
    haruhi.csv_to_list 

    # open first argument of the command line call to ldif_record_a.py for read/writing 
    with open(sys.argv[1],'r+') as f1: 
     lines=[x.strip() for x in f1] # Create list with each line as an element 
     f1.truncate(0) 
     f1.seek(0) 
     count = 0 
     for x in lines: 
     if x: 
      f1.write(x+'\n') 
     else: 
      f1.write("{0}: {1}\n\n".format(haruhi.keys[count] , haruhi.values[count])) 
      count = count + 1 
     f1.write("{0}: {1}\n\n".format(haruhi.keys[count] , haruhi.values[count])) 

我是新来的Python!任何帮助,建议和/或资源的方向将不胜感激!谢谢你这么

+0

你用什么python版本? – 2012-07-10 16:10:17

+0

而不是'self.keys = row [0]'我想你想说'self.keys.append(row [0])'? – Shaung 2012-07-10 16:33:19

+0

@ZagorulkinDmitry我正在使用2.7 – 2012-07-10 16:58:42

回答

1

好吧,我adhoc'd这一点,所以它需要的工作,但这里有云:

import csv 
import re 

csv_data = list(csv.reader(open('/home/jon/tmp/data.csv'))) # (1) 
csv_text = '\n' + '\n'.join('{0} : {1}'.format(*row) for row in csv_data) # (2) 

with open('/home/jon/tmp/other.ldif') as f: 
    contents = f.read() # (3) 
    print re.sub(r'(\n\n)|(\n$)', csv_text + '\n\n', contents) # (4) 
  • (1)阅读CSV文件导入列表的列表

    csv_data == [['KEY','VALUE'],['abc','def'],['foo','bar'],['qwop','flop']]

  • 2)创建一个文本表示以附加到每个ldif

    KEY:VALUE ABC:DEF FOO:酒吧 QWOP:翻牌

  • (3)打开和读取整个内容到内存中(不是很有效,你要知道)

  • (4)使用正则表达式来查找LDIF之后的“下位”,放在文本

打印:

dn: Aziz 
cn: Aziz_09 
KEY : VALUE 
abc : def 
foo : bar 
qwop : flop 

dn: Carl 
cn: Carl_04 
KEY : VALUE 
abc : def 
foo : bar 
qwop : flop 

您需要对其进行调整以便将数据写回或任何想要的内容......但是可能的起点 - 但强烈建议您使用它作为基础,并附带Python手册。随意要求澄清。

+0

Dope,这帮了我很大的忙。 Ty – 2012-07-11 15:07:53

+0

+1使用re.sub,从未见过像这样的打印 – 2012-07-11 15:14:05