1

我有一批 50-60 个 csv 文件,无论出于何种原因,每个文件的前四行都有垃圾数据。然而,在垃圾数据之后,列标题被正确列出,文件的其余部分很好。我怎么能在python中剥离前四个文件的每个文件?到目前为止,这是我的代码:

import csv
total = open('C:\\Csv\\201.csv', 'rb')
for row in csv.reader(total):
    print row

如您所见,我所做的只是打开文件并打印其内容。我一直在寻找删除 csv 文件某些方面的解决方案,但大多数要么删除整个列,要么取决于要删除的行的特定条件。就我而言,这只是一个顺序问题,每个文件都需要删除其前四行。非常感谢任何和所有帮助。

4

7 回答 7

7

你可以这样做:

reader = csv.reader(total)
all(next(reader) for i in range(4))

或者

for i in range(4): next(reader)
于 2013-02-23T19:50:52.117 回答
3
for i, line in enumerate(sys.stdin, -4):
    if i>=0: print line,
于 2013-02-23T19:42:25.853 回答
1

您可以编写一个通用函数来跳过任何序列的前 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
于 2013-02-23T20:46:08.077 回答
0

我很惊讶没有人建议在islice这里使用 Pythonic 方式......

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]
于 2013-02-23T22:12:20.993 回答
0

所有答案似乎都没有考虑到所需的标题行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 之外的所有行创建类似文件的对象的更好建议。

于 2016-02-19T21:52:35.993 回答
0

skiprows我很惊讶没有人在调用 read 函数时提到可用的参数。

df = pd.read_csv('somefile.csv',skiprows=4)

**skiprows**您可以检查文件中包含标题的行,如果值为 k,则按删除前 k 行的方式赋予值。

于 2020-06-01T17:21:42.923 回答
0

这就是我要跳过文件中的前四行

df = pd.read_csv("C:/Users//...",skiprows=4)
于 2021-02-02T13:36:54.150 回答