У меня есть файл csv, например 120 строк по 4500 строк. Я прочитал поле "имя клиента" в первом столбце, в первой строке. Затем я смотрю это поле во втором файле cvs, содержащем "имя клиента и идентификатор клиента", Я пишу новый файл cvs с "именем клиента", идентификатором клиента "и всем остальным 119 colunm.and продолжаем до конца первого файла.
Это работает, но у меня есть специальный символ везде в первых двух файлах csv. И я не хочу, чтобы "Montr\xe9al-Nord" вместо Монреаля-Норда или "Val\xe9rie Lamarche" вместо "Valérie Lamarche" в результирующем файле 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()
Любая помощь?
francois
Проблема в этой строке:
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", иначе называемом "серьезными акцентами", - это старомодный и устаревший способ сказать 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
Хотя я не знаком с csv.reader или writer, я недавно занимался чтением файлов utf-8 и, возможно, с помощью модуля кодеков мог помочь вам.
Вместо <
data = open(..., "wb")
попробовать,
import codecs
а затем для всех ваших файлов utf-8 используйте
data = codecs.open(..., "rb", "utf-8")
Это автоматически считывает ваши файлы в виде unicode (utf-8) и может правильно записать их в файл.
line[1]
,line[2]
,line[3]
,line[4]
,... И знаешь, что ? результат печати имеет хороший характер, но все же не resultat.writerow ...[
и]
--- см. Мои правки.