【问题标题】:python parsing string to csv formatpython将字符串解析为csv格式
【发布时间】:2019-04-27 17:32:29
【问题描述】:

我有一个文件包含以下格式的行

aaa=A;bbb=B;ccc=C

我想将其转换为 csv 格式,因此等式两侧的文字将是列,分号作为行分隔符。我试着做这样的事情

 f = open("aaa.txt", "r")
    with open("ccc.csv", 'w') as csvFile:
        writer = csv.writer(csvFile)
        rows = []
        if f.mode == 'r':
            single = f.readline()
            lns = single.split(";")
            for item in lns:
                rows.append(item.replace("=", ","))
            writer.writerows(rows)
            f.close()
            csvFile.close()

但我将每个字母作为一列,因此结果如下所示:

a,a,a,",",A
b,b,b,",",B
c,c,c,",",C,"

预期的结果应该是这样的

aaa,A
bbb,B
ccc,C

【问题讨论】:

    标签: python


    【解决方案1】:

    以下 1 行更改对我有用:

    rows.append(item.split('='))
    

    代替现有的代码

    rows.append(item.replace("=", ",")).
    

    这样,我能够创建一个列表列表,作者可以轻松读取该列表,因此 row 列表看起来像 [['aaa', 'A'], ['bbb', 'B'], ['ccc', 'C']] 而不是 ['aaa,A', 'bbb,B', 'ccc,C']

    【讨论】:

      【解决方案2】:

      只需将字符串逐行写入目标文件即可:

      import os
      f = open("aaa.txt", "r")
      with open("ccc.csv", 'w') as csvFile:
          single = f.readline()
          lns = single.split(";")
          for item in lns:
              csvFile.write(item.replace("=", ",") + os.linesep)
      f.close()
      

      输出将是:

      aaa,A
      bbb,B
      ccc,C
      

      【讨论】:

        【解决方案3】:

        它有助于交互式地执行命令并打印值,或在代码中添加调试打印(当一切正常时将被删除或注释)。在这里你可以看到rows['aaa,A', 'bbb,B', 'ccc,C'] 是3 个字符串,而它应该是三个序列。

        因为字符串是一个(只读)字符序列,writerows 使用每个字符作为一个字段。

        所以您不想用逗号 (,) 替换 =,但想在等号上拆分:

                ...
                for item in lns:
                    rows.append(item.split("=", 1))
                ...
        

        但 csv 模块需要使用newline='' 打开输出文件才能正确操作。

        所以你应该有:

        with open("ccc.csv", 'w', newline='') as csvFile:
            ...
        

        【讨论】:

          【解决方案4】:

          writer.writerows() 的参数必须是行的可迭代,它又必须是字符串或数字的可迭代。由于您将字符串列表传递给它,因此字符串中的字符被视为单独的字段。您可以通过先在';' 上拆分行,然后在'=' 上拆分行来获得正确的行列表:

          import csv
          
          with open('in.txt') as in_file, open('out.csv', 'w') as out_file:
              writer = csv.writer(out_file)
              line = next(in_file).rstrip('\n')
              rows = [item.split('=') for item in line.split(';')]
              writer.writerows(rows)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-30
            • 1970-01-01
            • 2021-07-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多