Python 3.7-CSV-从值中删除引号,quoting =csv。QUOTE_NONE给出错误

时间:2019-01-24 20:18:26

标签: python python-3.x

我正在尝试从正在创建的csv文件中删除“符号,但它给我一个错误:” _csv.Error:需要转义,但未设置转义字符“,或者它给了我quotechar = '“'每个第一个字符和最后一个字符。

我正在运行3.7 Python,并尝试通过以下更改来更改代码:

passphrase_writer = csv.writer(file, lineterminator='\n' ,quoting=csv.QUOTE_NONE)
        #passphrase_writer = csv.writer(file, delimiter=',', lineterminator='\n',quoting=csv.QUOTE_NONE,)
        #passphrase_writer = csv.writer(file, delimiter=',' ,lineterminator='\n', quoting=csv.QUOTE_NONE)

def print_dict(d,site_id):
with open('passphrases.csv', mode='w', newline='') as file:
    passphrase_writer = csv.writer(file, lineterminator='\n' ,quoting=csv.QUOTE_NONE)
    #passphrase_writer = csv.writer(file, delimiter=',', lineterminator='\n',quoting=csv.QUOTE_NONE,)
    #passphrase_writer = csv.writer(file, delimiter=',' ,lineterminator='\n', quotechar='|')

    for idx, val in enumerate(d['data']):
        x = (u'{},{},{},{},{},{},{},{}'.format(val['id'],
                                               val['Name'],
                                               val['domain'],
                                               val['Version'],
                                               val['lastLoggedIn'],
                                               val['networkInterfaces'][0]['inet'][0],
                                               val['id2'],
                                               passphrase(val['id'], site_id)
                                               ))
        print(x)
        passphrase_writer.writerow([x])

打印结果很好:

54356,tomer-a36,WORKGROUP,2.,tom,192.168.30.133,eafa2eb,DREAM

但是,csv文件将具有: "54356,tomer-a36,WORKGROUP,2.,tom,192.168.30.133,eafa2eb,DREAM"

我希望删除多余的“

注意-更改quotechar='|'时,我得到: |54356,tomer-a36,WORKGROUP,2.,tom,192.168.30.133,eafa2eb,DREAM|

尝试设置quotechar=''会出错。

1 个答案:

答案 0 :(得分:0)

您过于复杂,并且将自定义格式与内置的csv模块混合在一起

您正在传递已经格式化的参数的列表,分隔符为,csv模块必须对其进行引用以使其保持为单个“单元格”,因为默认的csv分隔符已为,csv模块具有内置的安全性,可避免丢失/损坏数据:不引用数据将使其中一个带有逗号的单元格与多个以逗号分隔的单元格区分开来。

相反,只需将参数写为数据的tuple并停止使用x构建str.format

for val in d['data']:
    passphrase_writer.writerow((val['id'],
                           val['Name'],
                           val['domain'],
                           val['Version'],
                           val['lastLoggedIn'],
                           val['networkInterfaces'][0]['inet'][0],
                           val['id2'],
                           passphrase(val['id'], site_id)
                           ))

由于您的数据从不包含,(您确定吗?实际上passphrase可能包含),因此您不必担心插入引号。

如果有(passphrase个很好的候选人),csv.reader将能够解析它们并删除它们以反序列化您的数据(就像Excel一样)。请勿尝试使用,手动拆分读取和解析的文件,而应再次使用csv模块。