Python 正则表达式从CSV中删除双引号

Python 正则表达式从CSV中删除双引号,python,sql,regex,excel,dictionary,Python,Sql,Regex,Excel,Dictionary,我有一个excel工作表,其中以python字典的形式从sql数据库将大量数据放在一列中。我无法访问原始数据库,也无法使用本地infle命令将CSV导入sql,因为CSV每行上的键/值顺序不同。将excel工作表导出为CSV时,我得到: "{""first_name"":""John"",""last_name"":""Smith"",""age"":30}" "{""first_name"":""Tim"",""last_name"":""Johnson"",""age"":34}" 删除键

我有一个excel工作表,其中以python字典的形式从sql数据库将大量数据放在一列中。我无法访问原始数据库,也无法使用本地infle命令将CSV导入sql,因为CSV每行上的键/值顺序不同。将excel工作表导出为CSV时,我得到:

"{""first_name"":""John"",""last_name"":""Smith"",""age"":30}"
"{""first_name"":""Tim"",""last_name"":""Johnson"",""age"":34}"
删除键/值周围的“花括号前后以及额外”的最佳方法是什么

我还需要保留整数,它们周围没有引号

然后,我尝试使用json模块将其导入python,以便打印特定的键,但不能使用双引号导入它们。我最终需要将数据保存在如下文件中:

{"first_name":"John","last_name":"Smith","age":30}
{"first_name":"Tim","last_name":"Johnson","age":34}

非常感谢您的帮助

我认为你想得太多了,为什么不替换数据呢

l = list()
with open('foo.txt') as f:
    for line in f:
        l.append(line.replace('""','"').replace('"{','{').replace('}"','}'))
s = ''.join(l)

print s # or save it to file
它产生:

{"first_name":"John","last_name":"Smith","age":30}
{"first_name":"Tim","last_name":"Johnson","age":34}

使用
列表
存储中间行,然后调用
.join
以提高性能,如

中所述。如果输入文件如图所示,且大小较小,则可以将整个文件加载到内存中,进行替换,然后保存。IMHO,你不需要正则表达式来做这件事。最容易阅读的代码是:

with open(filename) as f:
    input= f.read()
input= str.replace('""','"')
input= str.replace('"{','{')
input= str.replace('}"','}')
with open(filename, "w") as f:
    f.write(input)
我使用示例输入对其进行了测试,它生成:

{"first_name":"John","last_name":"Smith","age":30}
{"first_name":"Tim","last_name":"Johnson","age":34}
这正是你想要的

如果需要,还可以打包代码并编写

with open(inputFilename) as if:
    with open(outputFilename, "w") as of:
        of.write(if.read().replace('""','"').replace('"{','{').replace('}"','}'))

但我认为第一个更清晰,两者的作用完全相同。

您可以实际使用csv模块和正则表达式来实现这一点:

st='''\
"{""first_name"":""John"",""last_name"":""Smith"",""age"":30}"
"{""first_name"":""Tim"",""last_name"":""Johnson"",""age"":34}"\
'''

import csv, re

data=[]
reader=csv.reader(st, dialect='excel')
for line in reader:
    data.extend(line)

s=re.sub(r'(\w+)',r'"\1"',''.join(data))
s=re.sub(r'({[^}]+})',r'\1\n',s).strip()
print s
印刷品

{"first_name":"John","last_name":"Smith","age":"30"}
{"first_name":"Tim","last_name":"Johnson","age":"34"}
简单:

text=re.sub(r'(!)','',text)
给定输入文件:TEST.TXT:

“{”“姓”“约翰”“姓”“史密斯”“年龄”“:30}”

“{”“名字”“:”“蒂姆”“姓氏”“:”“约翰逊”“年龄”“:34}”

剧本:

重新导入
f=打开(“TEST.TXT”、“r”)
text_in=f.read()
text_out=re.sub(r'(!)','',text_in)
打印(文本输出)
生成以下输出:

{“名字”:“约翰”,“姓氏”:“史密斯”,“年龄”:30}

{“名字”:“蒂姆”、“姓氏”:“约翰逊”、“年龄”:34}

这应该可以做到:

with open('old.csv') as old, open('new.csv', 'w') as new:
    new.writelines(re.sub(r'"(?!")', '', line) for line in old)

这不是CSV格式。看起来您正在寻找JSON。我的帖子中的底部数据行是excel工作表中每一行的列。大约有13k排。当我将其保存到CSV时,我得到的是顶部。我想我可以使用JSON模块,但我需要去掉双引号。由于采用CSV格式,excel会在我将其保存到CSV时将我的现有报价加倍。感谢您的快速建议!我必须用完,但返回后会检查这些内容并选择答案。我感谢你的帮助@jabaldonedo
str
不是保留字。否则我的程序将无法编译和运行
str
是一个内置函数,如果我不使用它,我可以重新定义它。但你是对的,这可能会让人困惑。我正在更改代码。感谢您指出这一点,并帮助您做出更好的回答。