如何使用Python仅读取CSV文件的标题列?
我正在寻找一种方法来读取大量大型CSV文件的标题行 使用Pandas,我为每个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以
>>> 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
可能是最清晰的,因为已经是默认值了。