每行中字段不匹配的python数据处理

时间:2018-10-21 17:06:54

标签: python csv

我是python和编码的新手。我有像下面这样的大数据,并想将其保存在csv文件中,其中的字段为标题。所有字段均以','分隔,每个参数在右侧均具有值 例如对于LAIGCINAME="LocalLA"LAIGCINAME是字段,而"LocalLA"是值。我的问题是所有行都有一些缺少的字段。谁能帮助我如何在python中处理此问题,因为我们不同步的数据

ZXWN:GCI="12345",LAIGCINAME="LocalLA",PROXYLAI=NO,MSCN="11223344",VLRN="11223344",MSAREANAME="0"
ZWGA:GCI="13DADC12",PROXYLAI=NO,MSCVLRTYPE=MSCVLRNUM,MSCN="33223344",VLRN="22334455",MSAREANAME="0",NONBCLAI=NO;

1 个答案:

答案 0 :(得分:2)

由于您的数据有很多可能的列名,因此您需要首先解析整个文件以确定合适的名称列表。完成此操作后,可以写入输出文件的头,然后是所有数据。

通过使用csv.DictWriter()对象,缺少的条目将被写为空单元格。如果缺少值需要另一个值,例如,可以添加一个restval参数。 “不适用”

import csv

header = set()
input_filename = 'input.csv'
output_filename = 'output.csv'

with open(input_filename, newline='') as f_input:
    csv_input = csv.reader(f_input)

    # First determine all possible column names
    for row in csv_input:
        header.update({entry.split('=')[0] for entry in row})

with open(input_filename, newline='') as f_input, open(output_filename, 'w', newline='') as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.DictWriter(f_output, fieldnames=sorted(header))
    csv_output.writeheader()

    for row in csv_input:
        output_row = {}

        for entry in row:
            key, value = entry.split('=')
            output_row[key] = value.strip('"')

        csv_output.writerow(output_row)

对于您给出的两行,这将为您提供一个输出文件:

LAIGCINAME,MSAREANAME,MSCN,MSCVLRTYPE,NONBCLAI,PROXYLAI,VLRN,ZWGA:GCI,ZXWN:GCI
LocalLA,0,11223344,,,NO,11223344,,12345
,0,33223344,MSCVLRNUM,NO;,NO,22334455,13DADC12,

csv.dictwriter的工作原理是从字典中写一行,csv.writer的工作方式是获取项目列表。

该代码为称为output_row的每一行创建一个字典,然后将其写入输出文件。通过一次处理一行,该脚本将能够处理任何大小的文件,而不会遇到内存问题。


另一种方法是将整个文件读入内存并创建字典列表,每行一个。 header值可以同时计算。然后可以一次性编写此词典列表。

例如:

import csv

input_filename = 'input.csv'
output_filename = 'output.csv'

header = set()  # Use a set to create unique header values from all rows
output_rows = []    # list of dictionary rows

with open(input_filename, newline='') as f_input:
    csv_input = csv.reader(f_input)

    for row in csv_input:
        output_row = {}

        for entry in row:
            key, value = entry.split('=')
            output_row[key] = value.strip('"')
            header.add(key)

        output_rows.append(output_row)

with open(output_filename, 'w', newline='') as f_output:        
    csv_output = csv.DictWriter(f_output, fieldnames=sorted(header))
    csv_output.writeheader()
    csv_output.writerows(output_rows)

请注意,如果文件太大(您的问题提到您有大数据),则此方法将失败。