def import_lineups(self, players): with open(self.filename, 'r') as csv_file: lines = csv.reader(csv_file) try: header = next(lines) start_column = 4 # First 4 columns has info about tournament end_column = header.index('Instructions') - 1 except (IndexError, ValueError): raise LineupOptimizerIncorrectCSV position_names = header[start_column:end_column] players_dict = {player.id: player for player in players} lineups = [] for line in lines: if not line[0]: break lineup_players = [] for index, position in zip(range(start_column, end_column), position_names): try: player_data = line[index] player_data = player_data.replace( '(LOCKED)', '') # Remove possible '(LOCKED)' substring player_id = player_data.split('(')[1][:-1] except IndexError: raise LineupOptimizerIncorrectCSV try: player = players_dict[player_id] except KeyError: raise LineupOptimizerIncorrectCSV( 'Player not found in players pool') lineup_players.append(LineupPlayer(player, position)) lineups.append(Lineup(lineup_players)) return lineups
def import_lineups(self, players): with open(self.filename, 'r') as csv_file: lines = csv.reader(csv_file) try: header = next(lines) start_column = 4 # First 4 columns has info about tournament end_column = header.index('Instructions') - 1 except (IndexError, ValueError): raise LineupOptimizerIncorrectCSV position_names = header[start_column:end_column] players_dict = {player.id: player for player in players} lineups = [] for line in lines: if not line[0]: break lineup_players = [] for index, position in zip(range(start_column, end_column), position_names): try: match = re.search(self.LINEUP_PLAYER_ID_REGEX, line[index]) except IndexError: raise LineupOptimizerIncorrectCSV if not match: raise LineupOptimizerIncorrectCSV player_id = match.group('id') try: player = players_dict[player_id] except KeyError: raise LineupOptimizerIncorrectCSV('Player not found in players pool') lineup_players.append(LineupPlayer(player, position)) lineups.append(Lineup(lineup_players)) return lineups
def _parse_percents(value: Optional[str]) -> Optional[float]: value = value or '' if not value.strip(): return None try: parsed_value = float(value.replace('%', '').strip()) return parsed_value / 100 if parsed_value > 1 else parsed_value except ValueError: raise LineupOptimizerIncorrectCSV( 'Can\'t parse percents value, got %s' % value)