如何在Python中使用csv.reader处理法语字符如é、à、ç、ê、ë
我有一个CSV文件,里面有120列和4500行数据。我从第一列第一行读取“客户名称”这个字段。接着,我在第二个CSV文件中查找这个“客户名称”,这个文件里包含了“客户名称”和“客户ID”。然后,我创建一个新的CSV文件,里面包含“客户名称”、“客户ID”,以及其余的119列数据,一直处理到第一个文件的最后一行。
这个过程是可以正常工作的,但我在前两个CSV文件中有很多特殊字符。我不想在生成的CSV文件中看到'Montr\xe9al-Nord'这样的格式,而是希望看到完整的'Montréal-Nord',或者'Val\xe9rie Lamarche'而不是'Valérie Lamarche'。
这里有一段测试代码示例:
# -*- coding: utf-8 -*-
import types
import wx
import sys
import os, os.path
import win32file
import shutil
import string
import wx.lib.dialogs
import re
import EmailAttache
import StringIO,csv
import time
import csv
outputfile=open(os.path.join(u"c:\\transales","Resultat-second_contact_act.csv"), "wb")
resultat = csv.writer (outputfile )
def Writefile ( info1, info2 ):
print info1, info2
resultat.writerow( [ `info1`,`info2` ,`line[1]`,`line[2]`,`line[3]`,`line[4]`,`line[5]`,`line[6]`,`line[7]`,`line[8]`,`line[9]`,`line[10]`,`line[11]`,`line[12]`,`line[13]`,`line[14]`,`line[15]`,`line[16]`,`line[17]` ] )
data = open(os.path.join(u"c:\\transales","SECONDARY_CONTACTS.CSV"),"rb")
data2 = open(os.path.join(u"c:\\transales","AccountID+ContactID.csv"),"rb")
source1 = csv.reader(data)
source2 = csv.reader(data2)
for line in source1:
name= line[0]
data2.seek(0)
for line2 in source2:
if line[0] == line2[0]:
Writefile(line[0],line2[1])
break
outputfile.close()
有人能帮忙吗?
谢谢,francois
2 个回答
3
虽然我对csv.reader或writer不太熟悉,但最近我在处理utf-8文件读取方面有一些经验,也许使用codecs模块会对你有帮助。
你可以试试,
data = open(..., "wb")
然后对于你所有的utf-8文件,使用,
import codecs
这样可以自动将你的文件以unicode(utf-8)格式读取,并且可能会正确地写入你的文件。
data = codecs.open(..., "rb", "utf-8")
0
问题出在这一行:
resultat.writerow( [ `info1`,`info2` ,`line[1]`,`line[2]`,`line[3]`,`line[4]`,`line[5]`,`line[6]`,`line[7]`,`line[8]`,`line[9]`,`line[10]`,`line[11]`,`line[12]`,`line[13]`,`line[14]`,`line[15]`,`line[16]`,`line[17]` ] )
用“反引号”包裹一个表达式是一种过时的写法,实际上是表示 repr(expression)
的意思。
请看下面的例子:
>>> s = "Montréal"
>>> print s
Montréal
>>> print repr(s)
'Montr\xe9al'
>>> ord(s[5])
233
>>> hex(233)
'0xe9'
>>> s == "Montr\xe9al"
True
>>> `s` == repr(s)
True
有问题的这一行(有3个方面的问题)应该简单地替换为:
resultat.writerow([info1, info2] + [line[1:18]]) # WRONG (sorry!)
resultat.writerow([info1, info2] + line[1:18]) # RIGHT