Python Pandas,读取文件并在标题之前跳过行

时间:2018-06-18 16:45:01

标签: python pandas loops csv

我正在尝试遍历一些文件,并使用pandas跳过每个文件中标题之前的行。所有文件都采用相同的数据格式,除了一些文件在标题之前要跳过的行数不同。有没有办法循环文件并从每个文件的标题开始,有些行要跳过的行数比其他文件要多?

例如, 一些文件需要这个:

f = pd.read_csv(fname,skiprows = 7,parse_dates=[0])

有些人要求:

f = pd.read_csv(fname,skiprows = 15, parse_dates=[0])

这是我的代码循环遍历我的文件:

for name,ID in stations:
    path = str(ID)+'/*.csv'
    for fname in glob.glob(path):
        print(fname)
        f = pd.read_csv(fname,skiprows=15,parse_dates=[0]) #could also skip 7 depending on file
        ws = f['Wind Spd (km/h)']*0.27778 #convert to m/s from km/h
        dt = f['Date/Time']

2 个答案:

答案 0 :(得分:1)

一种方法是使用纯Python I / O读取文件以提取索引,然后将其提供给skip_rows的{​​{1}}参数。

这是非常有效的,因为第一步使用生成器表达式,该表达式只读取到达到所需的行。

pd.read_csv

如果您需要重复任务,请将其包含在函数中:

from io import StringIO
import pandas as pd
from copy import copy

mystr = StringIO("""dasfaf
kgafsda


Date/Time,num1,num2
2018-01-01,0,1
2018-01-02,2,3
""")

mystr2 = copy(mystr)

# replace mystr with open('file.csv', 'r')
with mystr as fin:
    idx = next(i for i, j in enumerate(fin) if j.startswith('Date/Time'))

# replace mystr2 with 'file.csv'
df = pd.read_csv(mystr2, skiprows=idx-1, parse_dates=[0])

print(df)

   Date/Time  num1  num2
0 2018-01-01     0     1
1 2018-01-02     2     3

答案 1 :(得分:0)

第一个建议/答案似乎是处理它的一个非常好的方法,但由于某些原因我无法让它为我工作。我确实找到了另一种方法来解决我的问题,使用try和python中的函数除外:

for name,ID in stations:
    #read in each stations .csv files, concatenate together, insert station id column
    path = str(ID)+'/*.csv'
    for fname in glob.glob(path):
        print(fname)
        try:
            f = pd.read_csv(fname,skiprows=7,parse_dates=[0])
        except:
            f = pd.read_csv(fname,skiprows=15,parse_dates=[0])
        ws = f['Wind Spd (km/h)']*0.27778 #convert to m/s from km/h
        dt = f['Date/Time']

这种方式如果第一次尝试读入文件失败(跳过7行),那么它会再次尝试使用另一个read_csv行(跳过15行)。这不是100%正确,因为我仍然需要硬编码要跳过的行数,但现在可以满足我的需求。