2017-06-21 104 views
0

我有一个巨大的csv文件(大约10GB的数据),我想删除它的头。如何删除python中的csv头?

搜索这个网站上,我发现这个解决方案:

with open("test.csv",'r') as f, open("updated_test.csv",'w') as f1: 
next(f) # skip header line 
for line in f: 
    f1.write(line) 

但是,这将意味着创建一个新的CSV文件。 ¿是否有一种方法可以在不循环所有csv行的情况下删除标题?

+1

为什么你做一个10 GB的文件行的副本按行?删除标题,并用一个新的名称存储..... !!! –

+0

为什么使用python? 'sed'可以很容易地做到这一点。如果你真的想使用Python和CSV,你最好根据你的需要使用熊猫 –

+1

用简单的'sed -i'1d'test.csv' – RomanPerekhrest

回答

2

你得到的一点是:你要删除的文件的开头行。这意味着您需要将标题后的完整内容转移到前面,这意味着要复制整个文件。

但是,当我们谈论10GB文件时,这太昂贵了。

在你的情况下,我建议读取前两行,存储它们的大小,打开文件以进行读/写而不创建(因此不会发生截断),在文件的开头写第二行并用尽可能多的空格填充它以覆盖原始的第一行和第二行。

这样你用一个非常长的行覆盖了前两行,它在语义上只包含来自第二行(第一行)的数据,而语法上只包含一些附加的尾随空格(在CSV文件中通常不会造成伤害)。

with open('a', 'rw+') as f: 
    headers = f.readline() 
    firstData = f.readline() 
    f.seek(0) 
    firstData = firstData[:-1] + ' ' * len(headers) + '\n' 
    f.write(firstData) 

我的输入,空格显示为点这里:

one.two.three.four.five 
1.2.3.4.5 
6.7.8.9.10 

我的输出,显示为点这里空间:

1.2.3.4.5........................ 
6.7.8.9.10 
0

与头使用熊猫= 0

df = pd.read_csv('yourfile.csv', sep='joursep', header=0) 
+0

我认为OP正试图避免将所有10 GB加载到内存中。 –

+0

另外,你想'skiprows = 1',而不是'header = 0' –