如何在Python中读取csv文件,如果该文件可以但不必在第一行包含标题?

6yjfywim  于 2023-03-15  发布在  Python
关注(0)|答案(2)|浏览(206)

我尝试使用csv.DictReader读取Python中的csv文件,我需要处理这两种情况:
1.当标题出现在第一行时:

col1,col2
foo,bar

1.当省略时:

foo,bar

我可以假设头文件总是col1,col2,如果它们被提供的话。我尝试使用fieldnames参数,但是当它们出现时,头文件被当作值处理:

reader = csv.DictReader(csv_file, fieldnames=['col1','col2'])
print(list(reader))

输出:

[{'col1': 'col1', 'col2': 'col2'}, {'col1': 'foo', 'col2': 'bar'}]

而不是:

[{'col1': 'foo', 'col2': 'bar'}]

使用不带fieldnames参数的csv.DictReader可以在有标头的情况下工作,但在没有标头的情况下返回空列表。

ttisahbt

ttisahbt1#

您可以阅读第一行,如果它与预期的头不同,则通过seek()返回到文件的开头
给定“in1.csv”

col1,col2
foo,bar

给定“in2.csv”

foo,bar

然后

import csv

fieldnames=['col1','col2']
for file_name in ["in1.csv", "in2.csv"]:
    with open(file_name, "r") as file_in:
        if file_in.readline().strip() != ",".join(fieldnames):
            file_in.seek(0)
        results = list(csv.DictReader(file_in, fieldnames=fieldnames))
    print(results)

应给予您:

[{'col1': 'foo', 'col2': 'bar'}]
[{'col1': 'foo', 'col2': 'bar'}]
ars1skjm

ars1skjm2#

您可以使用DictReader并向其提供您最终想要的字段名(以处理隐式无标头情况),然后处理显式情况,即有标头但现在需要跳过它:

import csv

header_vals = ["col1", "col2"]
header_row = {x: x for x in header_vals}

for fname in ["input1.csv", "input2.csv"]:
    with open(fname, newline="") as f:
        reader = csv.DictReader(f, fieldnames=header_vals)

        print(f"{fname}:")
        for row in reader:
            if row == header_row:
                print("  skipped explicit header")
                continue
            print(f"  {row}")

对于这两个文件:

input1.csv
==========
col1,col2
r1c1,r1c2
r2c1,r2c2

input2.csv
==========
r1c1,r1c2
r2c1,r2c2

打印:

input1.csv:
  skipped explicit header
  {'col1': 'r1c1', 'col2': 'r1c2'}
  {'col1': 'r2c1', 'col2': 'r2c2'}
input2.csv:
  {'col1': 'r1c1', 'col2': 'r1c2'}
  {'col1': 'r2c1', 'col2': 'r2c2'}

相关问题