7

嗨,我注意到,在使用DictWriterdelimiter=' '而不是字符串时,通过使用逗号而不','将字符串保存到文件中。""如何设置没有字符串" "

代码

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"
4

1 回答 1

6

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

但是,在这种情况下这样做会导致引发异常,因为某些数据字段包含delimiter您尝试使用的字符,并且未定义' '不同的字符。escapechar这在文档中提到:

如果未设置escapecharcsv.Error ,则如果遇到任何需要转义的字符,编写器将引发。

如果您考虑一下,这一切都是有道理的——如果字段中的数据本身包含未转义的分隔符字符,则 csv 文件将是不可解析的(即无效),因为无法从分隔符中分辨出数据——它们是非-identifiable—<em>如果结果如下所示:

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)
于 2013-08-28T20:40:00.700 回答