我正在尝试遍历一些文件,并使用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']
答案 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%正确,因为我仍然需要硬编码要跳过的行数,但现在可以满足我的需求。