函数定义的SyntaxError

时间:2017-08-20 17:11:04

标签: python

我试图将数据从Excel电子表格提取到MySQL。我的脚本无法找到Excel文件的路径,我的IDE(Spyder)在此行上发出错误:

def read_excel(r'C:\\Users\\ParaSystems Limited\\Desktop\\main.xlsx'):

 invalid syntax
import openpyxl
import pymysql as mdb

def read_excel(r'C:\\Users\\ParaSystems Limited\\Desktop\\main.xlsx'):
    masterdict = {}
    wb = openpyxl.load_workbook('main.xlsx')
    for sheet in wb:
        for arow in range(2, sheet.max_row+1):
            if sheet['A'+str(arow)].value:
                masterdict[sheet['A'+str(arow)].value] = {
                    'Equipment Number':sheet['B'+str(arow)].value,
                    'Number':sheet['C'+str(arow)].value,
                    'Description':sheet['D'+str(arow)].value,
                    'Manufacturer':sheet['E'+str(arow)].value,
                    'Serial Number':sheet['F'+str(arow)].value,
                    'Country  of Manufacturer':sheet['G'+str(arow)].value,
                    'Functional Location Description':sheet['H'+str(arow)].value,
                    'Functional Location Number (Short)':sheet['I'+str(arow)].value,
                    'Functional Location Number':sheet['J'+str(arow)].value,
                    'COST OF SERVICING AND MAINTENANCE':sheet['K'+str(arow)].value,
                    'Office Location':sheet['L'+str(arow)].value
                    }

    return masterdict

def inputIntoMySQL(masterdict):
    con = mdb.connect(host= '127.0.0.1', user = 'root', password =None,db='scraping')

    cur = con.cursor()
    with con:
        cur.execute("DROP TABLE IF EXISTS main")
        cur.execute("CREATE TABLE main (rid INT PRIMARY KEY, EquipmentNumber VARCHAR(75), Description VARCHAR(75),\
                    Manufacturer VARCHAR(50), SerialNumber INT,CountryOfManufacturer VARCHAR(25), \
                    FunctionalLocationDescription VARCHAR(50), FunctionalLocationNumberShort VARCHAR(75), FunctionalLocationNumber VARCHAR(25),\
                    CostOfServicingAndMaintenance DECIMAL(15,2),OfficeLocation VARCHAR(35))")
        for i in masterdict:
            cur.execute('INSERT INTO DISTRIBUTORS_NESTLE(rid, EquipmentNumber,Description,Manufacturer,SerialNumber,\
            CountryOfManufacturer,FunctionalLocationDescription, FunctionalLocationNumberShort,FunctionalLocationNumber\
            CostOfServicingAndMaintenance,OfficeLocation) VALUES("%s", "%s", "%s","%s","%s","%s","%s","%s","%s","%s","%s")'
            %(i,masterdict[i]['Equipment Number'],masterdict[i]['Description'],
              masterdict[i]['Manufacturer'],masterdict[i]['Serial Number'],masterdict[i]['Country  of Manufacturer'],
              masterdict[i]['Functional Location Description'], masterdict[i]['Functional Location Number (Short)'], masterdict[i]['Functional Location Number'],
              masterdict[i]['COST OF SERVICING AND MAINTENANCE'], masterdict[i]['Office Location']))
        con.commit()
        con.close()

2 个答案:

答案 0 :(得分:2)

语法错误是因为你正在定义一个函数(read_excel)而你正在将excel文件路径直接放在函数定义中 - 使用这种语法你不能将excel文件路径分配给一个变量,所以你不能在函数中使用它。

def read_excel(r'C:\Users\ParaSystems Limited\Desktop\main.xlsx')#Syntax error

要解决此问题,您可以创建一个参数并将该特定文件路径设为默认值:

def read_excel(excel_file_path = r'C:\Users\ParaSystems Limited\Desktop\main.xlsx')

然后当你调用该函数时,你可以在没有任何参数的情况下调用它,而excel_file_path将默认为那个例如。

read_excel()#Calls with excel_file_path as your default value

read_excel(excel_file_path = r'path\to\another\excel.xlsx') #Calls with excel_file_path as the passed parameter value

如果确实没有必要在任何其他excel上调用此函数,只需在read_excel函数中声明它并将参数留空。 e.g。

def read_excel():

excel_file_path = r'C:\Users\ParaSystems Limited\Desktop\main.xlsx'

答案 1 :(得分:0)

这不是有效的函数定义:

def read_excel(r'C:\\Users\\ParaSystems Limited\\Desktop\\main.xlsx'):
    masterdict = {}
    wb = openpyxl.load_workbook('main.xlsx')
    ...

括号内没有任何命名参数,只是一个原始字符串。

看起来你实际上意味着:

def read_excel(fname=r'C:\Users\ParaSystems Limited\Desktop\main.xlsx'):
    masterdict = {}  # [unchanged]
    wb = openpyxl.load_workbook(fname)  # _Uses_ the parameter.
    ...

此外,由于您使用的是原始字符串(r'...'),因此您不需要加倍反斜杠。 单个反斜杠应该可以工作。 (你必须自己验证一下。 我无法访问Windows系统,因此无法对其进行测试。)