Как использовать csv.reader в python с французским символом, таким как é, à, ç, ê, ë,

1

У меня есть файл 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

  • 0
    Я просто изменяю строку def Writefile (info1, info2): вывод информации info1, info2 по def Writefile (info1, info2): вывод информации info1, info2, line[1] , line[2] , line[3] , line[4] ,... И знаешь, что ? результат печати имеет хороший характер, но все же не resultat.writerow ...
  • 0
    Мой ответ по ошибке включил в себя лишние [ и ] --- см. Мои правки.
Теги:
csv

2 ответа

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", иначе называемом "серьезными акцентами", - это старомодный и устаревший способ сказать 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
  • 0
    это не работает !! the: line [1:18] записать всю информацию в один столбец !! и все же неправильный акцент
  • 0
    @francois: исправлено; пожалуйста, попробуйте снова.
Показать ещё 1 комментарий
3

Хотя я не знаком с csv.reader или writer, я недавно занимался чтением файлов utf-8 и, возможно, с помощью модуля кодеков мог помочь вам.

Вместо <

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

попробовать,

import codecs

а затем для всех ваших файлов utf-8 используйте

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

Это автоматически считывает ваши файлы в виде unicode (utf-8) и может правильно записать их в файл.

  • 0
    спасибо, вы решили мою проблему с "иностранными персонажами"
  • 0
    @sheepz: Рад, что это помогло тебе - это, конечно, не решение проблемы ОП! -)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню