and*_*abs 7 python csv dictionary python-2.x
嗨,我注意到在使用时DictWriter,delimiter=' '而不是','字符串被保存到文件中,""而使用逗号而没有使用。如何设置没有字符串的东西" "?
代码
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)
Run Code Online (Sandbox Code Playgroud)
文件A.csv:
MediaObject ID,URL
1152901,http://foo.bar/TRU716565.jpg
1152902,http://foo.bar/TRU716566.jpg
Run Code Online (Sandbox Code Playgroud)
文件B.csv:
ID;Gold label
TRU716565.jpg;Identifable X
TRU716566.jpg;Non identfiable X
Run Code Online (Sandbox Code Playgroud)
结果文件C.csv:
1152901 "Identifable X"
1152902 "Non identfiable X"
Run Code Online (Sandbox Code Playgroud)
通常,要禁止引用 csv 文件中的数据字段,您需要做的就是quoting=csv.QUOTE_NONE在csv.DictWriter()构造函数调用中添加关键字参数。
但是,在这种情况下这样做会导致引发异常,因为某些数据字段包含delimiter您尝试使用的字符' ',并且escapechar未定义不同的字符。文档中提到了这一点,其中说:
如果未设置转义字符,则在遇到任何需要转义的字符时,编写器将引发
csv.Error。
如果您考虑一下,这一切都是完全合理的 - 如果字段中的数据本身包含未转义的分隔符,则 csv 文件将无法解析(即无效),因为无法从分隔符中分辨出数据 - 它们将是非-identifiable-如果结果是这样的:
1152901 Identifable X
1152902 Non identfiable X
Run Code Online (Sandbox Code Playgroud)
因此,"\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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18945 次 |
| 最近记录: |