And*_*ndy 11 python csv pandas
我正在寻找一种方法来只读取大量大型CSV文件的标题行.
使用Pandas,我为每个csv文件提供了这个方法:
>>> df = pd.read_csv(PATH_TO_CSV)
>>> df.columns
Run Code Online (Sandbox Code Playgroud)
我只用csv模块就可以做到这一点:
>>> reader = csv.DictReader(open(PATH_TO_CSV))
>>> reader.fieldnames
Run Code Online (Sandbox Code Playgroud)
这些问题是每个CSV文件的大小都是500MB +,读取每个文件的整个文件似乎是一个巨大的浪费,只是为了拉出标题行.
我所有这一切的最终目标是提取独特的列名.一旦我在每个文件中都有列标题列表,我就可以这样做.
如何快速提取CSV文件的标题行?
Jar*_*rno 23
扩展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']
Run Code Online (Sandbox Code Playgroud)
pandas 可以有一个优势,它可以更优雅地处理 CSV 编码。
Jef*_*eff 12
这是一种方式.你得到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
Run Code Online (Sandbox Code Playgroud)
我用作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, []))
Run Code Online (Sandbox Code Playgroud)
我可能会迟到一点,但这是使用Python标准库来实现它的一种方法.在处理文本数据时,我更喜欢使用Python 3,因为unicode.所以这非常接近你原来的建议,除了我只读一行而不是整个文件.
import csv
with open(fpath, 'r') as infile:
reader = csv.DictReader(infile)
fieldnames = reader.fieldnames
Run Code Online (Sandbox Code Playgroud)
希望这有帮助!
关于什么:
pandas.read_csv(PATH_TO_CSV, nrows=1).columns
Run Code Online (Sandbox Code Playgroud)
那只会读取第一行并返回找到的列。
你错过nrows=1了 read_csv 的参数
>>> df= pd.read_csv(PATH_TO_CSV, nrows=1)
>>> df.columns
Run Code Online (Sandbox Code Playgroud)