如何在python中使用csv.reader与法语字符如é,à,ç,ê,ë,

时间:2010-07-28 18:17:32

标签: python csv

我有一个csv文件,如120列乘4500行。 我在第一行的第一行读到了“客户名称”字段。 然后我在另一个包含“客户名称和客户ID”的cvs文件中查看此字段 我写了一个新的cvs文件,其中包含“客户名称”,客户ID“以及119 colunm的所有其余部分。并继续直到第一个文件结束。

这是有效的,但我在前两个csv文件中到处都有特殊字符。 而且我不想拥有'Montr \ xe9al-Nord'而不是Montréal-Nord 或者'Val \ xe9rie Lamarche'而不是'ValérieLamarche'在生成的csv文件中。

这是一个测试代码示例:

# -*- 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()

任何帮助?

问候,弗朗索瓦

2 个答案:

答案 0 :(得分:3)

虽然我不熟悉csv.reader或writer,但我最近一直在处理utf-8文件读取,也许使用编解码器模块可能会帮助你。

而不是,

data = open(..., "wb")

试,

import codecs

然后对于所有的utf-8文件,请使用

data = codecs.open(..., "rb", "utf-8")

这会以unicode(utf-8)自动读取您的文件,并可能正确地将它们写入您的文件。

答案 1 :(得分: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]` ] )

将表达式包含在“back-ticks”又名“grave accents”中是一种老式的,不赞成使用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