当前位置: 首页 > 知识库问答 >
问题:

Python ldif注入和csv读取脚本

涂溪叠
2023-03-14

有人能帮我找出我做错了什么吗?我正在编写一个python shell脚本,它接受一个ldif文件和一个csv文件,然后将csv文件中的内容附加到ldif中每个记录的末尾。比如:

示例CSV:


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

样品本地设计院(ldif):


    dn: Aziz
    cn: Aziz_09

    dn: Carl
    cn: Carl_04

在pythonmyscript.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文件,解析记录之间的转义字符,并在每条记录的末尾插入列表字段(键和值):


    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的新手!任何帮助,建议和/或资源方向都将不胜感激!谢谢你SO

共有1个答案

芮安顺
2023-03-14

好吧,这是我临时安排的,所以它需要改进,但这里是:

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 == [['键','值'],['abc','def'],['foo','bar'],['qwop','flp']]

    (2)创建要附加到每个ldif的文本表示

    键:值abc:def foo:bar qwop:flop

    (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手册的基础上使用它。请随时要求澄清。

  •  类似资料:
    • 我在尝试生成一个简单DF的共线性分析时遇到了问题(见下文)。我的问题是,每次尝试运行该函数时,都会检索到以下错误消息: 下面是我正在使用的代码 我试图运行函数的DF如下所示。 我在这里有两个猜测;但不知道如何解决这个问题: -猜测1:np。arrange导致与标头发生某种冲突 -猜想2:问题来自blankseperator,它阻止函数正确地从一列跳转到另一列。问题是,我的CSV文件已经有分隔符(我

    • 问题内容: 我正在尝试根据我已经拥有的csv检查提取数据的值。它只会循环遍历CSV的行一次,我只能检查feed.items()的一个值。我需要在某个地方重置值吗?有没有更好/更有效的方法来做到这一点?谢谢。 问题答案: 您可以通过重置文件对象的读取位置来“重置” CSV迭代器。

    • 我想在java中实现以下功能: 一个类,具有根据提供的参数数量读取不同列数的不同csv文件的方法。对于ex: 这里csvPath和csvFileName是自解释的,但csvType在这里是为了获得对应于csv的表名。例如:如果csvType是employee,则表示此csv包含带有员工数据特定标题的员工数据。 现在,我想创建一个通用的泛型方法或类的组合,可以执行此操作,并将不同的csv加载到不同的

    • 问题内容: 我有一个包含100行的CSV文件。 如何读取特定行? 我想读第9行或第23行等? 问题答案: 您可以使用来过滤文件,如下所示:

    • 我正在通过Spark使用以下命令读取csv文件。 我需要创建一个Spark DataFrame。 我使用以下方法将此rdd转换为spark df: 但是在将rdd转换为df时,我需要指定df的模式。我试着这样做:(我只有两列文件和消息) 然而,我得到了一个错误:java。lang.IllegalStateException:输入行没有架构所需的预期值数。需要2个字段,但提供1个值。 我还尝试使用以

    • pyspark新手,希望将csv文件读取到数据帧。似乎不能让人读。有什么帮助吗? ()中的Py4JJavaError回溯(最近一次调用)----