我有一个.csv文件,其中2 +空行表示新数据部分。但先验我不知道每个部分有多少行。有没有办法直接读取熊猫数据框并停在前2个空白行?
数据如下(来自Google趋势结果的.csv文件,此处已截断)。
Web Search interest: zts
Worldwide; 2004 - present
Interest over time
Week,zts
2004-01-04 - 2004-01-10,0
2004-01-11 - 2004-01-17,80
Top regions for zts
Region,zts
Slovakia,100
Slovenia,23
Top cities for zts
City,zts
Bratislava (Slovakia),100
Wroclaw (Poland),39
Top searches for zts
focus zts,100
ford zts,90
Rising searches for zts
2002 focus zts,Breakout
battery tester,Breakout
现在我使用csv.reader()
并遍历所有行,并保留与第一列中的日期正则表达式匹配的行,并且有两列。但这似乎很苛刻。
如果我使用类似pandas.read_csv(input_file, header=4)
的东西(然后使用日期正则表达式来查找正确的部分),那么当最后一个部分有三列时(在这里它没有,但它可以),它会失败。
有没有办法在没有先验知道行数的情况下在第一个块之后停止pandas.read_csv()
?理想情况下,我想将这个.csv解析为五个数据框(每个数据部分一个),但此时我很高兴抓住第一部分。
答案 0 :(得分:1)
这是我对真正的问题的解决方案,我应该将我的一个.csv文件解释为几个.csv文件并在pandas之外进行拆分。
import csv
section = 1
line = 1
output_root = 'C:/Users/richard/Downloads/out'
input_file = 'C:/Users/richard/Downloads/in.csv'
input = open(input_file, 'rb')
reader = csv.reader(input)
for row in reader:
if any(row) & (line == 1):
output_file = output_root + '_' + str(section) + '.csv'
output = open(output_file, 'wb')
writer = csv.writer(output)
writer.writerow(row)
line += 1
elif any(row) & (line > 1):
writer.writerow(row)
line += 1
elif (line > 1):
output.close()
section += 1
line = 1
output.close()
input.close()
答案 1 :(得分:1)
您还可以使用正则表达式。它们适合这种情况。
import re
from cStringIO import StringIO
csv1 = """right,top,bottom
4,5,6
6,7,8
"""
csv2 = """up,down,left
1,2,3
7,6,5
"""
csv3 = """a,b,c
1,2,3
4,5,6
"""
join_n = randint(2, 6, size=2)
raw = [csv1, csv2, csv3]
csvs = []
for csv, n in zip(raw, join_n):
csvs.append(csv + '\n' * n)
csvs.append(csv3)
csvs = ''.join(csvs)
splitsville = re.split('\n{2,}', csvs)
dfs = []
for sp in splitsville:
dfs.append(read_csv(StringIO(sp)))
final_df = concat(dfs, axis=1)
print final_df
的产率:
right top bottom up down left a b c
0 4 5 6 1 2 3 1 2 3
1 6 7 8 7 6 5 4 5 6
注意:您不一定必须concat
list
DataFrame
,但通常这是一个有用的下一步,这样您就不会我必须继续list
DataFrame
的操作。