【问题标题】:How to parse this text file format into CSV format?如何将此文本文件格式解析为 CSV 格式?
【发布时间】:2018-07-10 06:29:34
【问题描述】:

我有一个这样布局的文本文件,其中每个字段都是一个新行:

id = 606149
Category Name = Structural Columns
Family Name = Concrete-Square-Column
Type Name = EXIST RH C1 16 x 16
Document = 15050 Peavy Struct v2016_detached
Attachment Justification At Top = Minimum Intersection
Image = <None>
Offset From Attachment At Top = 0
id = 606151
Category Name = Structural Columns
Family Name = Concrete-Square-Column
Type Name = EXIST RH C2 16 x 16
Document = 15050 Peavy Struct v2016_detached
Attachment Justification At Top = Minimum Intersection
Image = <None>
Offset From Attachment At Top = 0

在我的代码中,我打开文本文件进行阅读并打印出前三行进行测试。当我尝试在行尾附加逗号时,我在下面的行中得到逗号:

def main():
   count = 0
   filename = "test.txt"
   file = open(filename, "r")
   for line in file:
      if count == 3:
         break
      count = count + 1
      line += ','
      print line

使用这段代码,我得到了结果:

id = 606149
,
Category Name = Structural Columns
,
Family Name = Concrete-Square-Column
,

当我在连接逗号之前添加换行符以去除新行时:

line = line.strip('\n')"

我得到这个结果:

,id = 606149
,ategory Name = Structural Columns
,amily Name = Concrete-Square-Column

我无法将此文件解析为 CSV 格式。

【问题讨论】:

  • edit 提出您的问题,并通过解析显示的输入显示所需的输出。

标签: python csv parsing formatting


【解决方案1】:

您可以读取整个文件并拆分行

filename = "text.txt"
file = open(filename, "r")

f = file.read().splitlines()
for line in f:
    print(line)

【讨论】:

    【解决方案2】:

    您可以这样做以获得所需的 o/p,但您必须提到这一点:

    with open('j.txt', 'r') as f:
    d =f.readlines()
    for i in d:
        i = i.rstrip('\n')
        i+=','
        print(i)
    

    我在这里使用了rstrip,它将打印所有行,对于前三行,您可以给出一些循环或条件。 O/P 是这样的:

    id = 606149, 类别名称 = 结构柱, 姓氏 = 混凝土方柱, 类型名称 = EXIST RH C1 16 x 16, 文件 = 15050 Peavy Struct v2016_detached,
    附件理由,在顶部 = 最小交点, 图像 = 从顶部的附件偏移 = 0,

    【讨论】:

      【解决方案3】:

      如果您的数据文件的结构如上所示,您可以使用“=”来分隔每个键值对,将它们存储到每一行的字典中,然后在您完全读取每条记录之后(即找到“Offset. ..' 键值)开始另一行。

      获得所有数据后,使用csv module 写入您的 csv 文件。

      import csv
      
      data = []
      with open('test.txt') as fin:
          row = {}
          for line in fin:
              key, val = line.strip().split(' = ')
              row[key] = val
              if key == 'Offset From Attachment At Top':
                  data.append(row)
                  row = {}
      
      fieldnames = data[0].keys()
      with open('test.csv') as fout:
          cw = csv.DictWriter(fout, fieldnames)
          cw.writerows(data)
      

      您可能想要添加一些错误检查,并且可能想要限制对DictWriter 的调用中字段名称的顺序。我建议你把每一行都设为OrderedDict

      【讨论】:

        【解决方案4】:

        这应该可以工作

        line.rstrip("\n") + ","
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-03
          • 2021-08-04
          • 1970-01-01
          • 2019-04-14
          • 1970-01-01
          相关资源
          最近更新 更多