我正在寻找一种方法来只读取大量大型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文件的标题行?
答案 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()
在这种情况下,您只能阅读很少的行以获得标题