2015-06-17 3 views
-1

Я работаю над проектом анализа данных в Python. У меня есть файл .xls, который мне нужно прочитать и получить определенную информацию из каждой строки. Я использую xlrd.Анализ данных при чтении файла .xls с использованием Python

Когда я открываю файл в блокноте, первые десять строк являются комментариями о том, что содержит файл, а затем я получаю фактические данные. Как пропустить все строки, начинающиеся с «#»?

Кроме того, как только я получаю строки, я хочу перебирать каждую строку и разделять элементы в каждом столбце каждой строки и добавлять ее в словарь для каждого столбца. Как я могу отделить данные в каждой строке на основе столбца?

В настоящее время, вот мой код:

peaksheets = peakfile.sheet_by_name("Sheet1") 
    num_rows = peaksheets.nrows -1 
    curr_row = -1 
    while curr_row < num_rows: 
      curr_row +=1 
      row = str(peaksheet.row(curr_row)) 
      words = row.strip().split('\t') 
      c = words[0] 
      s = int(words[1]) 

Я также получаю следующее сообщение об ошибке, когда я запускаю мой код:

xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record; found '# This f' 

, поэтому я хочу, чтобы пропустить строки, начинающиеся с символом «#».

ответ

0

Как насчет этого?

peaksheets = peakfile.sheet_by_name("Sheet1") 
dict_data = {} 
num_rows = peaksheets.nrows -1 
curr_row = -1 
while curr_row < num_rows: 
     curr_row +=1 
     # we want to skip the comments 
     if row.startswith('#'): 
      continue 
     row = str(peaksheet.row(curr_row)) 
     words = row.strip().split('\t') 
     for i in range(len(words)): 
      dict_data[curr_row][i] = words[i] 
     c = words[0] 
     s = int(words[1]) 
1

Попробуйте использовать pandas для чтения файла в dataframe. Если вам действительно нужны данные в словаре, вы можете передать их одному из файла данных.

import pandas as pd 
df = pd.read_excel('file.xls', 'Sheet1', skiprows=range(10)) 
datadict = df.to_dict(orient='dict') 
0

Если первые 10 строк являются единственными, которые вы не хотите, вы всегда можете просто начать curr_row в 10. Что касается словаря, попробуйте следующее:

headers=[(names of the columns to use as keys for your dict)] 
dict_list=[] 
col_list=[None]*len(headers)  
for curr_row in range(10, peaksheets.nrows): 
    for curr_cell in range(peaksheets.ncols): 
     cell_value = str(peaksheets.cell(curr_row, curr_cell).value) 
     col_list[curr_row].append(cell_value) 

for head_name in headers: 
    dict_list[head_name]=col_list[headers.index(head_name)] 

Несколько вещи, чтобы иметь в виду:

  1. Этот код предполагает, что вы хотите каждый столбец
  2. Это требует структурировать headers в порядке, в котором столбцы отображаются на листе
  3. Это должно быть заменой вашей петли while.
  4. Если есть больше комментариев, вы можете проверить, является ли первый элемент строки «#», и игнорировать его.
Смежные вопросы