Сначала я использовал файл CSV с помощью регулярного выражения, но поскольку данные в файле очень строго расположены в каждой строке, мы можем просто использовать функцию split ()
import gviz_api
scheme = [('col1','string','SURNAME'),('col2','number','ONE'),('col3','number','TWO')]
data_table = gviz_api.DataTable(scheme)
# --- lines in surnames.csv are : ---
# surname,percent,cumulative percent,rank\n
# SMITH,1.006,1.006,1,\n
# JOHNSON,0.810,1.816,2,\n
# WILLIAMS,0.699,2.515,3,\n
with open('surnames.csv') as f:
def transf(surname,x,y):
return (surname,float(x),float(y))
f.readline()
# to skip the first line surname,percent,cumulative percent,rank\n
data_table.LoadData( transf(*line.split(',')[0:3]) for line in f )
# to populate the data table by iterating in the CSV file
Или без определяемой функции:
import gviz_api
scheme = [('col1','string','SURNAME'),('col2','number','ONE'),('col3','number','TWO')]
data_table = gviz_api.DataTable(scheme)
# --- lines in surnames.csv are : ---
# surname,percent,cumulative percent,rank\n
# SMITH,1.006,1.006,1,\n
# JOHNSON,0.810,1.816,2,\n
# WILLIAMS,0.699,2.515,3,\n
with open('surnames.csv') as f:
f.readline()
# to skip the first line surname,percent,cumulative percent,rank\n
datdata_table.LoadData( [el if n==0 else float(el) for n,el in enumerate(line.split(',')[0:3])] for line in f )
# to populate the data table by iterating in the CSV file
В какой-то момент я полагал, что был вынужден заполнять таблицу данных одной строкой за раз, потому что я использовал регулярное выражение, и это требовалополучить группы совпадений, прежде чем всплыть строки чисел.С помощью split () все можно выполнить в одной инструкции с помощью LoadData ()
.
Следовательно, ваш код может быть сокращен.Кстати, я не понимаю, почему он должен продолжать определять класс.Вместо этого мне кажется, что функции достаточно:
def GvizFromCsv(filename):
""" creates a gviz data table from a CSV file """
data_table = gviz_api.DataTable([('col1','string','SURNAME'),
('col2','number','ONE' ),
('col3','number','TWO' ) ])
# --- with such a table schema , lines in the file must be like that: ---
# blah, number, number, ...anything else...\n
# SMITH,1.006,1.006, ...anything else...\n
# JOHNSON,0.810,1.816, ...anything else...\n
# WILLIAMS,0.699,2.515, ...anything else...\n
with open(filename) as f:
data_table.LoadData( [el if n==0 else float(el) for n,el in enumerate(line.split(',')[0:3])]
for line in f )
return data_table
.
Теперь вы должны проверить, можно ли вставить в этот код способ, которым данные CSV считываются из другого API, чтобы сохранитьпринцип итерации для заполнения таблицы данных.