0

有人可以帮我弄清楚我做错了什么吗?我正在编写一个 python shell 脚本,它接受一个 ldif 文件和一个 csv 文件,然后将 csv 文件中的内容附加到 ldif 中每条记录的末尾。就像是:

CSV 样本:

    “核心价值”
    "abc","def"
    “富”、“酒吧”
    “qwop”,“翻牌”

示例 .ldif:

    dn:阿齐兹
    cn: Aziz_09

    dn:卡尔
    cn: 卡尔_04

python myscript.py "sample.ldif" "sample.csv" 之后

    dn:阿齐兹
    cn: Aziz_09
    核心价值
    abc:定义
    富:酒吧
    qwop:翻牌

    dn:卡尔
    cn: 卡尔_04
    核心价值
    abc:定义
    富:酒吧
    qwop:翻牌

到目前为止,我的代码可以编译,但是它没有正确修改文件。我正在创建一个对象,该对象在创建时采用 csv 文件路径名字符串,然后将键存储到列表字段中,并将值存储到列表字段中。然后我打开 ldif 文件,解析记录之间的转义字符,并在每条记录的末尾插入列表字段(KEY 和 VALUE):

    导入系统,csv

    # 创建可以打开 csv 并在其数组中设置 csv 数据的新对象
    类容器(对象):
      def __init__(self, filename=None, keys=None, values=None):
        self.filename = 文件名
        self.keys = []
        自我价值 = []

      # 打开 self.filename 并将第 0 行和第 1 行分别放入键和值中  
      def csv_to_list():
        使用 open(self.filename, 'rb') 作为 f:
          阅读器 = csv.reader(f)
          对于阅读器中的行:
            self.keys = 行[0]
            self.values = 行[1]

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

    # 打开命令行调用 ldif_record_a.py 的第一个参数进行读/写
    使用 open(sys.argv[1],'r+') 作为 f1:
      lines=[x.strip() for x in f1] # 创建列表,每行作为一个元素
      f1.truncate(0)
      f1.seek(0)
      计数 = 0
      对于 x 行:
         如果 x:
           f1.write(x+'\n')
         别的:
           f1.write("{0}: {1}\n\n".format(haruhi.keys[count] , haruhi.values[count]))
           计数 = 计数 + 1
      f1.write("{0}: {1}\n\n".format(haruhi.keys[count] , haruhi.values[count]))

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

4

1 回答 1

1

好的,我特设了这个,所以它需要工作,但这里是:

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 的文本表示

    键:值 abc:def foo:bar 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 手册。随时要求任何澄清。

于 2012-07-10T17:52:15.987 回答