python - csv.DictWriter 定界符设置为空格表示 ""中的文本

标签 python csv dictionary python-2.x

您好,我注意到在使用 DictWriterdelimiter=' ' 而不是 ',' 时,字符串被保存到文件 "" while 通过使用没有逗号。如何设置没有 "" 的字符串?

代码

import csv
golds_two =[]
mydict ={}

with open ('fileA.csv','rU') as csvfile:
    wszystkie=csv.DictReader(csvfile,delimiter=',')
    for w in wszystkie:
        mydict[(w['URL']).split('/')[-1]]=w['MediaObject ID']


with open ('fileB.csv','rU') as csvfile:
    golds=csv.DictReader(csvfile,delimiter=';')
    for g in golds:
        g['MediaObject ID']=mydict[g['ID']]
        golds_two.append(g)


with open('fileC.csv','w') as F: 
        head_fields =golds_two[0].keys()
        head_fields.remove('ID')
        print head_fields
        head_fields=sorted(head_fields,reverse=True)
        csvdw = csv.DictWriter(F,delimiter=" ",fieldnames=head_fields)
        headers = dict( (n,n) for n in head_fields)

        for z in golds_two:
            z.pop('ID',None)
            print z
            csvdw.writerow(z)

文件A.csv:

MediaObject ID,URL
1152901,http://foo.bar/TRU716565.jpg
1152902,http://foo.bar/TRU716566.jpg

文件B.csv:

ID;Gold label
TRU716565.jpg;Identifable X
TRU716566.jpg;Non identfiable X

生成的文件 C.csv:

1152901 "Identifable X"
1152902 "Non identfiable X"

最佳答案

通常,要抑制 csv 文件中数据字段的引用,您需要做的就是将 quoting=csv.QUOTE_NONE 关键字参数添加到您的 csv.DictWriter() 构造函数调用。

但是,在这种情况下这样做会引发异常,因为某些数据字段包含您尝试使用的 delimiter 字符,' ',并且还未定义不同的 escapechardocumentation 中提到了这一点它说:

If escapechar is not set, the writer will raise csv.Error if any characters that require escaping are encountered.

如果您考虑一下,这一切都非常有意义——如果字段中的数据本身包含未转义的定界符,则 csv 文件将无法解析(即无效),因为无法从定界符中分辨出数据——它们” d 是不可识别的——如果结果看起来像这样:

1152901 Identifable X
1152902 Non identfiable X

因此,将分隔符更改为 "\t" 将去掉引号(正如您已经发现的那样),或者您可以定义一个 escapechar="\\"(或其他)在构造函数调用中将定界符设置为 "" — 因为要么文件的定界符与其数据字段的内容之间不再有冲突,要么有办法遇到它们时躲开它们。

如果出于某种未知原因您真的希望结果与您陈述的一样,我想您总是可以手动写出文件。

更新:这是一种可能的解决方法,它将数据字段中的任何空格字符更改为 '\xa0',这是我系统上的一个不间断空格,但显示与常规空格字符相同。

with open('fileC.csv', 'w') as F:
    head_fields = golds_two[0].keys()
    head_fields.remove('ID')
    print(head_fields)
    head_fields = sorted(head_fields, reverse=True)
    csvdw = csv.DictWriter(F, delimiter=" ", fieldnames=head_fields,
                           quoting=csv.QUOTE_NONE)
    #headers = dict((n, n) for n in head_fields)

    for z in golds_two:
        z.pop('ID', None)
        print(z)
        for k,v in z.iteritems():
            z[k] = v.replace(' ', '\xa0')  # Convert space chars to non-breaking.
        csvdw.writerow(z)

关于python - csv.DictWriter 定界符设置为空格表示 ""中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18442311/

相关文章:

python - 理解是什么让这个正则表达式如此缓慢

python - Django 提供过时的表单验证选项

python - 如何使用 pandas 在我的最终 df 中添加和排序月-年列?

python - 重新格式化此 json 输出时出现问题吗?

python 密码检查器 : numbers and symbols

python - 在 Python 中将维基百科表格抓取为 CSV

javascript - 使用 d3.js 仅显示 csv 文件中的 20 行数据

php - 如何下载文件而不是保存 CSV 文件

python - 从txt文件Python创建字典

python - 如何将具有多个值的字典写入 CSV?