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

时间:2014-07-25 19:10:20

标签: 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文件的标题行?

9 个答案:

答案 0 :(得分:11)

这是一种方式。你得到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

答案 1 :(得分:7)

我可能会迟到一点,但这是使用Python标准库的一种方法。在处理文本数据时,我更喜欢使用Python 3,因为unicode。所以这非常接近你原来的建议,除了我只读一行而不是整个文件。

import csv    

with open(fpath, 'r') as infile:
    reader = csv.DictReader(infile)
    fieldnames = reader.fieldnames

希望这有帮助!

答案 2 :(得分:6)

我已使用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, []))

答案 3 :(得分:4)

怎么样:

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

仅读取第一行并返回找到的列。

答案 4 :(得分:3)

answer given by Jeff上扩展现在可以使用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编码。

答案 5 :(得分:0)

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

for filename in glob.glob(files_path+"\*.csv"):
    with open(filename) as f:
        first_line = f.readline()

答案 6 :(得分:0)

import pandas as pd

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

答案 7 :(得分:0)

您错过了read_csv的nrows=1参数

>>> df= pd.read_csv(PATH_TO_CSV, nrows=1)
>>> df.columns

答案 8 :(得分:0)

您可以轻松地使用它:

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

在这种情况下,您只能阅读很少的行以获得标题