我有一批50-60个csv文件,无论出于什么原因,每个文件的前四行都有垃圾数据。然而,在垃圾数据之后,列标题会正确列出,文件的其余部分也没问题。我该如何在python中剥离前四个文件中的每个文件?这是我迄今为止的代码:
import csv
total = open('C:\Csv\201.csv', 'rb')
for row in csv.reader(total):
print row
正如你所看到的,我所做的只是打开文件并打印它的内容。我四处寻找删除csv文件某些方面的解决方案,但大多数要么删除整列,要么取决于要删除的行的特定条件。在我的情况下,这只是一个顺序问题,每个文件都需要去掉前四行。我们非常感谢所有的帮助。
你可以做:
reader = csv.reader(total)
all(next(reader) for i in range(4))
或
for i in range(4): next(reader)
for i, line in enumerate(sys.stdin, -4):
if i>=0: print line,
您可以编写一个通用函数来跳过任何序列的前n项:
def skip_first(seq, n):
for i,item in enumerate(seq):
if i >= n:
yield item
使用它:
import csv
with open('C:\Csv\201.csv', 'rb') as total:
csvreader = csv.reader(total)
for row in skip_first(csvreader, 4):
print row
这个函数是通用的,因为它可以跳过任何序列,而不仅仅是文件:
# Skip the first three
list = ['happy', 'grumpy', 'doc', 'sleepy', 'bashful', 'sneezy', 'dopey']
for item in skip_first(list, 3):
print item
我很惊讶没有人在这里提出使用islice
的Python方式。。。
from itertools import islice
with open('somefile') as fin:
csvin = islice(csv.reader(fin), 4, None, None)
for row in csvin:
pass
示例:
>>> r = range(10); list(islice(r, 4, None, None))
[4, 5, 6, 7, 8, 9]
所有答案似乎都没有考虑到DictReader
所需的标题行:除非第一行包含字段列表以外的任何内容,否则DictReader
将无法识别它们并正确解析。
因为csv.reader
需要类似文件的对象,所以我不得不使用StringIO
作为临时缓冲区(这不是一个严重的问题,我通常有大约20行)。
with StringIO() as csvio:
for i, line in enumerate(myfile.iter_lines()):
if i < 5:
continue
else:
csvio.write(line)
reader = csv.DictReader(csvio)
如果所有行都在内存中,请提供更好的建议,说明如何为除第一个N之外的所有行创建类似文件的对象,而不进行缓冲。
我很惊讶在调用read函数时没有人提到skiprows
可用的参数。
df = pd.read_csv('somefile.csv',skiprows=4)
您可以检查文件中是否有包含标头的行,并根据**skiprows**
指定值。如果值为k,则会删除前k行。
这是我跳过文件中前四行的方法
df = pd.read_csv("C:/Users//...",skiprows=4)