如何使用Python仅读取CSV文件的标题列?

如何使用Python仅读取CSV文件的标题列?,python,csv,pandas,Python,Csv,Pandas,我正在寻找一种方法来读取大量大型CSV文件的标题行 使用Pandas,我为每个csv文件提供了以下方法: >>> df = pd.read_csv(PATH_TO_CSV) >>> df.columns 我只需要csv模块就可以做到这一点: >>> reader = csv.DictReader(open(PATH_TO_CSV)) >>> reader.fieldnames 问题是,每个CSV文件的大小都是500MB以

我正在寻找一种方法来读取大量大型CSV文件的标题行

使用Pandas,我为每个csv文件提供了以下方法:

>>> df = pd.read_csv(PATH_TO_CSV)
>>> df.columns
我只需要csv模块就可以做到这一点:

>>> reader = csv.DictReader(open(PATH_TO_CSV))
>>> reader.fieldnames
问题是,每个CSV文件的大小都是500MB以上,而仅仅为了拉标题行而读取每个CSV文件的整个文件似乎是一种巨大的浪费

我所有这些的最终目标是提取唯一的列名。一旦我有了每个文件中的列标题列表,我就可以这样做


如何快速提取CSV文件的标题行?

这里有一种方法。你得到1排

In [9]: DataFrame(np.random.randn(10,4),columns=list('abcd')).to_csv('test.csv',mode='w')

In [10]: read_csv('test.csv',index_col=0,nrows=1)
Out[10]: 
          a         b         c         d
0  0.365453  0.633631 -1.917368 -1.996505

我以
iglob
为例搜索
.csv
文件,但一种方法是使用集合,然后根据需要进行调整,例如:

import csv
from glob import iglob

unique_headers = set()
for filename in iglob('*.csv'):
    with open(filename, 'rb') as fin:
        csvin = csv.reader(fin)
        unique_headers.update(next(csvin, []))

我可能会在聚会上迟到一点,但这里有一种方法可以使用Python标准库来完成。在处理文本数据时,我更喜欢使用Python3,因为它使用unicode。这与你最初的建议非常接近,只是我只看了一行而不是整个文件

import csv    

with open(fpath, 'r') as infile:
    reader = csv.DictReader(infile)
    fieldnames = reader.fieldnames
希望这有帮助

那么:

pandas.read_csv(PATH_TO_CSV, nrows=1).columns

这将只读取第一行并返回找到的列。

这取决于标题的用途,如果您只需要用于比较目的的标题(我的案例),这段代码将非常简单和快速,它将整个标题作为一个字符串读取。您可以根据需要将所有收集的字符串转换在一起:

for filename in glob.glob(files_path+"\*.csv"):
    with open(filename) as f:
        first_line = f.readline()
通过扩展,现在可以在不实际读取任何行的情况下使用
pandas

In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: pd.DataFrame(np.random.randn(10, 4), columns=list('abcd')).to_csv('test.csv', mode='w')

In [4]: pd.read_csv('test.csv', index_col=0, nrows=0).columns.tolist()
Out[4]: ['a', 'b', 'c', 'd']

pandas
的优点是它可以更优雅地处理CSV编码。

您错过了读取CSV的
nrows=1
参数

import pandas as pd

get_col = list(pd.read_csv("first_test_pipe.csv",sep="|",nrows=1).columns)
print(get_col)
>>> df= pd.read_csv(PATH_TO_CSV, nrows=1)
>>> df.columns

您可以很容易地使用此选项:

df = pd.read_csv("path.csv", skiprows=0, nrows=2)
df.columns.to_list()

在这种情况下,您只能读取很少的行来获取标题

注意,
DictReader
不会读取整个文件。。。因此,您可以在需要的文件上迭代使用它,并构建一个集合。。。我在我的回答中做了类似的事情…这确实读了一行不必要的内容,但是为了阅读标题。。。但也许我不太清楚到底是什么原因我很感激你的回答,杰夫。我把你的答案和乔恩提供的答案作了比较。这两种方法都有效,但这一个的运行速度比他提供的慢5倍左右。@Jon Clements OP只需要标题,但
read\u csv()
不使用
nrows=0
-
read\u csv()运行
至少需要读取一行。@Andy如果这对你来说很重要,那么使用另一个解决方案。这是pandas方法。@Jeff&Jon Clements:我认为你可以添加
header=None
以获得正常行的标题-没有第一行数据。我将此与Jeff提供的答案进行了比较。对于我的一个数据集样本,这个答案的运行速度大约是熊猫答案的5倍。我怀疑这是因为它没有读取额外的数据行(我也很欣赏关于DictReader的注释)。Thanks@Andy我怀疑真正的区别不是不必要地读取额外的行,而是创建数据帧的开销……我可以知道这句话的意思吗?“唯一的_头。更新(下一步(csvin,[])”@jonclements这应该是新的公认答案。这是最快、最清晰的方法,也是最好的提示。我发现用
header
替换
index\u col
得到了一个我丢失的额外字段名。否则,其余的工作就完美了@Markmoreto我认为这取决于CSV中是否有一个没有标题的额外索引列。若并没有,那个么将
index\u col=False
设置为
header=0
可能是最清晰的,因为
已经是默认值了。