首页 > 解决方案 > Python:遍历字符串列表并将它们与类对象相关联

问题描述

我创建了一个名为 Tables 的类,它具有用于在 MySQL 中创建表的nameddlcols属性。

我有一个名为的所有 Table 对象的列表mylist

我有一个名为的所有 Table 对象名称的列表tables

我有一个 csv 的剥离文件名列表,我将使用它来将数据加载到名为list_files.

如果 in 中的项目list_files与 Table 对象的 in 匹配namemylist我想将 Table 对象中列出的列中的数据插入cols到关联的 MySQL 表中 - 换句话说,我想将列表项用作具有匹配名称的 Table 对象。

一旦我弄清楚如何使用字符串 inlist_files作为现有 Table 对象的名称,我就可以构建 INSERT 语句。

到目前为止,这是我的代码:

from pathlib import Path

mylist = []

class Table:

    table_list = mylist

    def __init__(self, name, ddl):
        self.name = name
        self.ddl = ddl
        self.cols = []
        self.skip_id = False  # indicates whether to skip the AUTO_INCREMENT '_id'
        # column on import/update

    def add_to_list(self, table_list):
        table_list.append(self)

    def add_cols(self):
        text = self.ddl.split('`')
        self.cols = text[3::2]

    def skip_auto_inc_id(self):
        if 'AUTO_INCREMENT' in self.ddl:
            self.skip_id = True


# 2 example Table objects
sub_leagues = Table('sub_leagues', '''CREATE TABLE IF NOT EXISTS `sub_leagues` (
  `subl_id` INT PRIMARY KEY,
  `league_id` INT,
  `sub_league_id` INT,
  `name` VARCHAR(50),
  )
   ENGINE=InnoDB DEFAULT CHARSET=latin1''')
sub_leagues.add_to_list(mylist)

divisions = Table('divisions', '''CREATE TABLE IF NOT EXISTS `divisions` (
  `d_id` INT AUTO_INCREMENT PRIMARY KEY,
  `league_id` INT,
  `sub_league_id` INT,
  `division_id` INT,
  `name` VARCHAR(50),
  `gender` INT
  )
   ENGINE=InnoDB DEFAULT CHARSET=latin1''')
divisions.add_to_list(mylist)

tables = []
for table in mylist:
    table.add_cols()
    table.skip_auto_inc_id()
    if table.skip_id:
        table.cols = table.cols[1:]
    tables.append(table.name)

files = ['sub_leagues.csv', 'divisions.csv']

list_files = []

for file in files:
    filename = Path(file).stem
    list_files.append(filename)

#  This is where I'm stumped
for filename in list_files:
    if filename in tables:
        print(filename.cols)

这显然不起作用,但我想将其filename视为具有相同名称的 Table 对象,并且不确定正确的方法。

标签: pythonclass

解决方案


您可以制作一个字典来将文件名映射到 Table 对象:

tables = {}
for table in mylist:
    table.add_cols()
    table.skip_auto_inc_id()
    if table.skip_id:
        table.cols = table.cols[1:]
    tables[table.name] = table

for filename in list_files:
    if filename in tables:
        table = tables[filename]

推荐阅读