Преобразовать в исполняемые значения в словаре python - PullRequest
0 голосов
/ 16 июня 2020

У меня есть один словарь с именем column_types со значениями, как показано ниже.

column_types = {'A': 'pa.int32()',
                'B': 'pa.string()'
               }

Я хочу передать словарь в функцию чтения csv pyarrow, как показано ниже

from pyarrow import csv
table = csv.read_csv(file_name,
                     convert_options=csv.ConvertOptions(column_types=column_types)
                     )

Но он дает ошибка, поскольку значения в словаре представляют собой строку. Приведенный ниже оператор будет работать без каких-либо проблем.

from pyarrow import csv
table = csv.read_csv(file_name, convert_options=csv.ConvertOptions(column_types = {
                  'A':pa.int32(),
                  'B':pa.string()
               }))

Как я могу изменить значения словаря на исполняемые операторы и передать их в csv.ConvertOptions?

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Есть два способа, которые сработали для меня, вы можете использовать оба из них, однако я бы порекомендовал второй, поскольку первый использует eval() и его использование рискованно в случаях ввода пользователем. Если вы не используете строку ввода, указанную пользователем, вы также можете использовать метод 1.

1) USING eval()

import pyarrow as pa

column_types={}

column_types['A'] = 'pa.'+'string'+'()'
column_types['B'] = 'pa.'+'int32'+'()'

final_col_types={key:eval(val) for key,val in column_types.items()} # calling eval() to parse each string as a function and creating a new dict containing 'col':function()

from pyarrow import csv
table = csv.read_csv(filename,convert_options=csv.ConvertOptions(column_types=final_col_types))
print(table)

2) Создав главный словарь dict_dtypes, содержащий имя вызываемой функции для конкретной строки. И далее, используя dict_dtypes, чтобы сопоставить строку с соответствующей функцией.

import pyarrow as pa

column_types={}

column_types['A'] = 'pa.'+'string'+'()'
column_types['B'] = 'pa.'+'int32'+'()'

dict_dtypes={'pa.string()':pa.string(),'pa.int32()':pa.int32()} # master dict containing callable function for a string
final_col_types={key:dict_dtypes[val] for key,val in column_types.items() } # final column_types dictionary created after mapping master dict and the column_types dict

from pyarrow import csv
table = csv.read_csv(filename,convert_options=csv.ConvertOptions(column_types=final_col_types))
print(table)
0 голосов
/ 16 июня 2020

Почему бы нам не использовать что-то вроде этого:

column_types = {'A': pa.int32(),
                'B': pa.string()}

table = csv.read_csv(file_name, 
                     convert_options=csv.ConvertOptions(column_types=column_types))
...