我是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;
答案 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)
请注意,如果文件太大(您的问题提到您有大数据),则此方法将失败。