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

如何在python中使用csv.reader和法语字符,如éàçêë;,,python,csv,Python,Csv,我有一个csv文件,比如120列乘以4500行。 我阅读了第一列第一行中的字段“customer name”。 然后在第二个cvs文件中查找此字段,该文件包含“客户名称和客户ID” 我编写了一个新的cvs文件,其中包含“客户名称”、“客户ID”以及119 colunm中的所有其他内容,并一直持续到第一个文件的末尾 这是工作,但我有特殊的字符无处不在的前两个csv文件。 我不想用“Montr\xe9al Nord”代替Montréal Nord 或在生成的csv文件中使用“Val\xe9rie L

我有一个csv文件,比如120列乘以4500行。 我阅读了第一列第一行中的字段“customer name”。 然后在第二个cvs文件中查找此字段,该文件包含“客户名称和客户ID” 我编写了一个新的cvs文件,其中包含“客户名称”、“客户ID”以及119 colunm中的所有其他内容,并一直持续到第一个文件的末尾

这是工作,但我有特殊的字符无处不在的前两个csv文件。 我不想用“Montr\xe9al Nord”代替Montréal Nord 或在生成的csv文件中使用“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,尽管我不熟悉csv.reader或writer,但我最近一直在处理utf-8文件读取问题,也许使用编解码器模块可以帮助您

而不是

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

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

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

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

问题出在这一行:

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”来包装表达式是一种过时且不受欢迎的表达方式

请考虑以下事项:

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

@sheepz:很高兴它帮了你--这肯定不是OP问题的解决方案!-)那不行!!:行[1:18]把所有信息都写在一列!!还是错的accent@francois:已修复;请重试。谢谢John,您刚刚保存了我的假期。在您的帮助下,我将能够在今晚之前导入所有这些文件。关于francoisI,我只需修改def Writefile(info1,info2)行:按def Writefile打印info1,info2(info1,info2):打印info1,info2,
行[1]
行[2]
行[3]
行[4]
,…你知道吗?打印结果很好,但仍然不是结果。writerow…我的答案错误地包含了一个超级
[
]
——请参阅我的编辑。
resultat.writerow([info1, info2] + [line[1:18]]) # WRONG (sorry!)
resultat.writerow([info1, info2] + line[1:18]) # RIGHT