Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用Python加载到MySQL之前,如何替换CSV头中的特殊字符?_Python_Mysql_Csv - Fatal编程技术网

在使用Python加载到MySQL之前,如何替换CSV头中的特殊字符?

在使用Python加载到MySQL之前,如何替换CSV头中的特殊字符?,python,mysql,csv,Python,Mysql,Csv,我通常处理大型数据集,并且正在尝试编写一个脚本,该脚本将加载数据集,而无需太多手动工作(我为非技术公司工作)。该脚本将在加载数据时运行另一个测试(但我还没有开始编写这部分代码)。我能够使用以下代码加载数据: mycursor.execute("drop table if exists rd.data") with open(r"C:\Users\rcsid\Documents\Office Programs\Working prog\MOCK_DATA.csv&q

我通常处理大型数据集,并且正在尝试编写一个脚本,该脚本将加载数据集,而无需太多手动工作(我为非技术公司工作)。该脚本将在加载数据时运行另一个测试(但我还没有开始编写这部分代码)。我能够使用以下代码加载数据:

mycursor.execute("drop table if exists  rd.data")
with open(r"C:\Users\rcsid\Documents\Office Programs\Working prog\MOCK_DATA.csv") as csvfile:
    csv_reader = csv.DictReader(csvfile)
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'''create table rd.data ( {" varchar(100), ".join(row)} varchar(100))''')
            sql_str=f'''create table rd.data ( {" varchar(100), ".join(row)} varchar(100))'''
            mycursor.execute(sql_str)
        sql_str1=f'''insert into rd.data values ('{"',' ".join(row.values())}')'''
        print(sql_str1)
        mycursor.execute(sql_str1)
        line_count += 1  
代码将加载数据,而无需手动更新代码(使用%s技术,我认为我的同事无法编写)。所以,我已经解决了问题的第一部分。我现在遇到的问题是csv头中是否有特殊字符。我想用“\”替换特殊字符。我进行了一些研究,得出了以下更新:

mycursor.execute("drop table if exists  rd.data")
with open(r"C:\Users\rcsid\Documents\Office Programs\Working prog\MOCK_DATA.csv") as csvfile:
    csv_reader = csv.DictReader(csvfile)
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            #print(f'''create table rd.data ( {" varchar(100), ".join(re.sub('[^a-zA-Z0-9]\n\.', '_', row))} varchar(100))''')
            sql_str=f'''create table rd.data ( {" varchar(100), ".join(re.sub('[^a-zA-Z0-9]\n\.', '_', row))} varchar(100))'''
            mycursor.execute(sql_str)
        sql_str1=f'''insert into rd.data values ('{"',' ".join(row.values())}')'''
        print(sql_str1)
        mycursor.execute(sql_str1)
        line_count += 1
现在,如果我将
'[^a-zA-Z0-9]\n\.
\n\.
一起包含,那么错误是:

SyntaxError: f-string expression part cannot include a backslash
TypeError: expected string or bytes-like object
如果我将其删除,则错误为:

SyntaxError: f-string expression part cannot include a backslash
TypeError: expected string or bytes-like object

有人能帮我解决上面的两个问题,以及如何替换特殊字符和创建表。我是Python新手,因此它可能看起来非常基本。注意:数据仅用于分析,不加载到任何服务器或任何东西。

我能够通过以下代码解决问题:

mycursor.execute("drop table if exists  rd.data")
#r"C:\Users\rcsid\Documents\Office Programs\Working prog\MOCK_DATA.csv"
#re.sub('[^a-zA-Z0-9]\n\.', '_', row)
reader = csv.DictReader(open(r"C:\Users\rcsid\Documents\Office Programs\Working prog\MOCK_DATA.csv",encoding='utf-8',errors='ignore'), delimiter=',')
rowHeaders = reader.fieldnames
print(rowHeaders)
for i in rowHeaders:
    field_name.append(re.sub('[^A-Za-z0-9]+', '_', i))
print(field_name)
print(f'''create table rd.data ( {" varchar(100), ".join(field_name)} varchar(100))''')
sql_str=f'''create table rd.data ( {" varchar(100), ".join(field_name)} varchar(100))'''
mycursor.execute(sql_str)
for row in reader:
    sql_str1=f'''insert into rd.data values ('{"',' ".join(row.values())}')'''
    print(sql_str1)
    mycursor.execute(sql_str1)

请务必让我知道这是否有任何回退。

为了帮助简化,请查看
pandas.read\u csv
pandas.To\u sql
。从函数名可以推断,这些函数可用于读取CSV数据;(连同任何字符替换),然后存储到SQL;如果愿意,将自动创建数据库表。关于正则表达式模式,请在字符串前面放置一个
r
r'[^a-zA-Z0-9]\n\.
。这会告诉Python使用原始字符串,并防止将反斜杠解释为转义字符。感谢您的回复。我用您的代码替换了正则表达式:print(f''create table rd.data({“varchar(100)”).join(re.sub(r'[^a-zA-Z0-9]\n\.','''u',row))}.varchar(100))''),但仍然得到上面提到的f-string错误。还有别的想法吗?