如何在Python中使用csv.reader处理法语字符如é、à、ç、ê、ë

1 投票
2 回答
4901 浏览
提问于 2025-04-16 01:58

我有一个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

撰写回答