我有一个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()
任何帮助?
问候,弗朗索瓦
答案 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