在使用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错误。还有别的想法吗?