使用python跳过行读取CSV文件,直到我们找到某些列

oxalkeyp  于 2023-04-03  发布在  Python
关注(0)|答案(3)|浏览(166)

我想读取CSV文件使用Python的skiprows动态条件后。
条件-每当我在CSV中找到6个cols时,或者当我找到colnames序列时,从那里读取。
File.csv

Col1,col2,col3

1,2,3

13,u,u

,,,

,,,

Col1,col2,col3,col4

1,2,3,4

13,u,u,y

,,,

,,,

Col1,col2,col3,col4,col5,col6

1,2,3,4,5,6

qw,ers,hh,yj,df,ji

现在我使用pandas.read_csv()阅读这个文件
我知道在第10行我需要cols。
pandas.read_csv("file.csv", skiprows=10, header=None)
想要跳过这个动态跳过行时,我们6列或在这个序列col 1,col 2,col 3,col 4,col 5,col 6。

start =  df.loc[df.FILE-START == 'col1,col2,col3,col4,col5,col6'].index[0]
df = pd.read_csv(filename, skiprows = start + 1)

我试过了,但它不工作。

zzzyeukh

zzzyeukh1#

更新

使用csv模块的更健壮版本:

import pandas as pd
import csv
import io

with open('File.csv') as fp:
    while True:
        pos = fp.tell()
        reader = csv.reader(io.StringIO(fp.readline()))
        row = next(reader)
        if len(row) == 6:
            break
    fp.seek(pos)
    df = pd.read_csv(fp)

旧答案

你可以一行一行地读这个文件,直到你找到6列或者5个逗号(注意它们之间是否有引号和逗号,但是对于一个简单的csv文件来说是可以的:

import pandas as pd

with open('File.csv') as fp:
    while True:
        pos = fp.tell()
        row = fp.readline()
        if row.count(',') == 5:
            break
    fp.seek(pos)
    df = pd.read_csv(fp)

输出:

>>> df
  Col1 col2 col3 col4 col5 col6
0    1    2    3    4    5    6
1   qw  ers   hh   yj   df   ji
mpgws1up

mpgws1up2#

pandas的DataFrame * 构造函数 * 的另一个选项:

import csv
import pandas as pd

with open("file.csv") as csv_file:
    csv_reader = csv.reader(csv_file)
    rows = [row for row in csv_reader if len(row) == 6]
    data_six = {"columns": rows[0], "data": rows[1:]}​
    df = pd.DataFrame(**data_six)

正如@Corralien所解释的那样,使用这种方法,pandas失去了推断每列数据类型的能力,因为csv.reader总是返回一个字符串列表。
csv.reader(csvfile,dialect='excel',**fmtparams)
返回一个reader对象,它将迭代给定的csvfile中的行。csvfile可以是任何支持迭代器协议的对象,并且每次调用它的_next_()方法时返回一个字符串-文件对象和列表对象都适用。从csv文件读取的每一行都以字符串列表的形式返回。

  • 源码 *:[docs.python]

输出:

print(df)

  Col1 col2 col3 col4 col5 col6
0    1    2    3    4    5    6
1   qw  ers   hh   yj   df   ji
  • 注意:这假设你的csv文件总是以六列数据和唯一的标题结束。*
bq9c1y66

bq9c1y663#

您可以使用以下方法:

def check_num_or_colseq(row):
    return len(row)==6 or (row[0]=='col1' and row[1]=='col2' and row[2]=='col3' and row[3]=='col4' and row[4]=='col5' and row[5]=='col6')

 // suppose you read the csv file
    readervar = csv.reader(file)
    for i,row in enumrate(readervar):
          if check_num_or_colseq(row):
              skip = i 
              break

df = pd.read_csv(filename, skiprows = skip + 1)

我认为上面所有的代码都是不言自明的。希望这对你有帮助。

相关问题